覆盖函数的默认参数[重复]

Posted

技术标签:

【中文标题】覆盖函数的默认参数[重复]【英文标题】:Default argument of overridden function [duplicate] 【发布时间】:2012-10-08 05:29:22 【问题描述】:

可能重复:virtual function default arguments behaviour

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

【问题讨论】:

看看这个:***.com/questions/6464404/… 【参考方案1】:

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

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

考虑:

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:

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

【讨论】:

以上是关于覆盖函数的默认参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在函数c ++中将变量作为默认参数传递[重复]

JavaScript 函数中的默认参数值 [重复]

PYQT5 - 插槽函数不采用默认参数 [重复]

函数 6默认参数

php学习笔记-默认参数

非静态成员作为非静态成员函数的默认参数[重复]