虚拟function默认参数

任何人都可以解释一下c ++编译器为虚函数的参数保留默认值吗? 我知道在子类中更改这些参数是一个坏主意,但是为什么? 谢谢。

这是一个坏主意,因为它们不在任何地方。

使用的默认值将是静态(编译时)types中定义的那些值。 所以,如果您要更改覆盖中的默认参数,但通过基类指针或引用调用函数,则将使用基底中的默认值。

#include <iostream> struct Base { virtual ~Base(){ } virtual void foo(int a=0) { std::cout << "base: " << a << std::endl; } }; struct Derived : public Base { virtual ~Derived() { } virtual void foo(int a=1) { std::cout << "derived: " << a << std::endl; } }; int main() { Base* derived = new Derived(); derived->foo(); // prints "derived: 0" delete derived; } 

赋予虚函数默认参数初始值设定项往往会打败多态性,并在类层次结构中引入不必要的复杂性。

考虑以下不符合规范的代码

 class Thing { public: virtual ~Thing(); virtual void doItNTimes( int numTimes = 10 ); virtual void doItThisHigh( double howHigh = 1.0 ); // ... }; class MyThing : public Thing { public: void doItNTimes( int numTimes ); void doItThisHigh( double howHigh = 2.2 ); // ... }; 

默认的初始化程序不是函数签名types的一部分, 不参与覆盖或隐藏。 因此,在此不符合代码示例中显示的两个基类虚函数都将在派生类中重写。 但是,基类和派生类接口中默认参数初始值设定项的状态差异会导致行为差异, 具体取决于使用哪个接口访问对象。

 MyThing *mt = new MyThing; Thing *t = mt; t->doItNTimes(); // default of 10 mt->doItNTimes(); // compile time error! t->doItThisHigh(); // default of 1.0! mt->doItThisHigh(); // default of 2.2 

在这段代码中,MyThing类的devise者的意图是不清楚的。 据推测,对于MyThingtypes的对象,默认值doItThisHigh是重要的。 但是,当通过Thing接口操作MyThing时,是否也应该默认使用该值。

更多详情请参考下面的链接https://www.securecoding.cert.org/confluence/display/cplusplus/OOP04-CPP++Prefer+not+to+give+virtual+functions+default+argument+initializers