Вывод статического базового типа и динамического производного типа

Ответ на приведенный ниже вывод 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;
}

0

Решение

Посмотри на Могут ли виртуальные функции иметь параметры по умолчанию?:

Вызов виртуальной функции (10.3) использует аргументы по умолчанию в
объявление виртуальной функции, определяемой статическим типом
указатель или ссылка, обозначающая объект. Основная функция
в производном классе не получает аргументы по умолчанию от
функция переопределяет.

Следовательно, bptr->display(); вызывает производную версию display, но использует аргумент из baseстатический тип указателя bptr,

Это связано с тем, что значение аргумента по умолчанию должно быть определено во время компиляции, а динамическое связывание откладывается до времени выполнения. Использование разных аргументов по умолчанию в базовой и производной версиях одного и того же виртуального почти гарантированно вызовет проблемы. Проблемы могут возникнуть, когда виртуальный вызов вызывается через ссылку или указатель на базу, но версия, которая выполняется, определяется производной. В таких случаях аргумент по умолчанию, определенный для базовой версии виртуальной машины, будет передан производной версии, которая была определена с использованием другого аргумента по умолчанию.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]