3

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

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

4

1 回答 1

7

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

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

考虑:

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:

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

于 2012-10-08T05:33:45.617 回答