Ответ на приведенный ниже вывод main — «Отображение производного класса с i = 10», но я не понимаю, почему? Конечно, функция была вызвана на базовый тип?
Что такое мыслительный процесс при определении ответа здесь?
class base
{
public:
virtual void display(int i = 10)
{
cout<<"Base class display with i = "<<i<<endl;
}
};
class derived : public base
{
public:
void display(int i = 20)
{
cout<<"Derived class display with i = "<< i <<endl;
}
};
int main(int argc, char *argv[])
{
base *bptr = new derived;
bptr->display();
return 0;
}
Посмотри на Могут ли виртуальные функции иметь параметры по умолчанию?:
Вызов виртуальной функции (10.3) использует аргументы по умолчанию в
объявление виртуальной функции, определяемой статическим типом
указатель или ссылка, обозначающая объект. Основная функция
в производном классе не получает аргументы по умолчанию от
функция переопределяет.
Следовательно, bptr->display();
вызывает производную версию display
, но использует аргумент из base
статический тип указателя bptr
,
Это связано с тем, что значение аргумента по умолчанию должно быть определено во время компиляции, а динамическое связывание откладывается до времени выполнения. Использование разных аргументов по умолчанию в базовой и производной версиях одного и того же виртуального почти гарантированно вызовет проблемы. Проблемы могут возникнуть, когда виртуальный вызов вызывается через ссылку или указатель на базу, но версия, которая выполняется, определяется производной. В таких случаях аргумент по умолчанию, определенный для базовой версии виртуальной машины, будет передан производной версии, которая была определена с использованием другого аргумента по умолчанию.
Других решений пока нет …