Аргумент по умолчанию переопределенной функции

Возможный дубликат:
поведение аргументов по умолчанию для виртуальной функции

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 ++.

2

Решение

Параметры, передаваемые в функцию, определяются кодом, который вызывает функцию. Поведение функции, однажды вызванной, зависит от класса. Если вам нужно такое поведение, создайте виртуальную функцию, которая не принимает параметров.

Получить параметр по умолчанию для производной функции было бы невозможно, потому что вызывающий код не может даже видеть прототип для этой функции.

Рассматривать:

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:

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

6

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

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

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