Возможный дубликат:
поведение аргументов по умолчанию для виртуальной функции
class Human{ virtual void print(int height =72){ cout << "Human: " << height << endl; }};
class Child:public Human{ void print(int height =48){ cout << "Child: " << height << endl; }};
int main()
{
Human * brother = new Child();
brother->print();
}
Результат это
Child: 72
Почему он получает параметр по умолчанию из базового класса и определение функции из производного класса? Ожидается объяснение, связанное со стандартами C ++.
Параметры, передаваемые в функцию, определяются кодом, который вызывает функцию. Поведение функции, однажды вызванной, зависит от класса. Если вам нужно такое поведение, создайте виртуальную функцию, которая не принимает параметров.
Получить параметр по умолчанию для производной функции было бы невозможно, потому что вызывающий код не может даже видеть прототип для этой функции.
Рассматривать:
void someFunction(Human *h)
{
h->print();
}
Этот код может не иметь представления, что существует класс, производный от Human
это имеет print
функция со значением по умолчанию 48. И, в любом случае, не было бы способа узнать, действительно ли передать это значение.
После того, как этот код скомпилирован, он может быть связан с таким кодом:
class BasketBallPlayer : public Human
{
void print(int height = 84);
}
Human *j = new BasketBallPlayer();
someFunction(j);
См. 8.3.6.10:
Вызов виртуальной функции использует аргументы по умолчанию в объявлении виртуальной функции, определяемой статическим типом указателя или ссылкой, обозначающей объект. Переопределяющая функция в производном классе не получает аргументы по умолчанию от перезаписываемой функции.
Других решений пока нет …