覆盖函数的默认参数

Nay*_*iya 3 c++ overloading

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

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();
}
Run Code Online (Sandbox Code Playgroud)

结果就是这个

Child: 72
Run Code Online (Sandbox Code Playgroud)

为什么它从派生类中获取基类和函数定义的默认参数?期待与C++标准相关的解释.

Dav*_*rtz 6

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

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

考虑:

void someFunction(Human *h)
{
    h->print();
}
Run Code Online (Sandbox Code Playgroud)

此代码可能不知道存在一个派生自Human具有print默认值为48 的函数的类.并且,无论如何,它无法知道实际传递该值.

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

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

Human *j = new BasketBallPlayer();
someFunction(j);
Run Code Online (Sandbox Code Playgroud)

见8.3.6.10:

虚函数调用使用由表示对象的指针或引用的静态类型确定的虚函数声明中的默认参数.派生类中的重写函数不会从它覆盖的函数中获取默认参数.