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 ++标准相关的解释。
答案 0 :(得分:6)
传递给函数的参数由调用函数的代码决定。函数的行为一旦被调用,就取决于该类。如果需要此行为,请创建不带参数的虚函数。
获取派生函数的默认参数是不可能的,因为调用代码甚至不能看到该函数的原型。
考虑:
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:
虚函数调用使用由表示对象的指针或引用的静态类型确定的虚函数声明中的默认参数。派生类中的重写函数不会从它覆盖的函数中获取默认参数。