重写函数的默认参数

Default argument of overridden function

本文关键字:参数 默认 函数 重写      更新时间:2023-10-16

可能重复:
虚拟函数默认参数行为

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++standers相关的解释。

传递给函数的参数由调用该函数的代码决定。函数的行为一旦被调用,就取决于类。如果需要此行为,请创建一个不带参数的虚拟函数。

获取派生函数的默认参数是不可能的,因为调用代码甚至不一定能看到该函数的原型。

考虑:

void someFunction(Human *h)
{
h->print();
}

此代码可能不知道存在一个从Human派生的类,该类具有默认值为48的print函数。而且,在任何情况下,它都无法知道如何实际传递该值。

在这个代码编译很久之后,它可能会链接到这样的代码:

class BasketBallPlayer : public Human
{
void print(int height = 84);
}
Human *j = new BasketBallPlayer();
someFunction(j);

见8.3.6.10:

虚拟函数调用在虚拟函数的声明中使用默认参数,该参数由表示对象的指针或引用的静态类型决定。派生类中的重写函数不会从它重写的函数中获取默认参数。