虚函数中的默认参数

时间:2013-02-08 06:36:37

标签: c++ virtual-functions default-arguments

请帮我找一下背后的原因:

#include <iostream>
using std::cout;

class A {
  public:
     virtual void fun(int a = 5) { cout<<a; }
};
class B::public A {
  public:
     void fun(int a = 10) {
        cout<<"Inside A::B::fun().\n";
        cout<<"\n"<<a;
     }
};
int _tmain(int argc, _TCHAR* argv[]) {
  A *obj = new B();
  obj->fun();
  reutrn 0;
}

虽然它正在调用B :: fun(),仍然打印5,为什么以及如何工作。?

2 个答案:

答案 0 :(得分:1)

A *obj = new B();
obj->fun();

在此代码中,fun()以多态方式调用 - 调用者使用(仅)A::fun()的知识,但调用将调度到重定向到B::fun()实现的指针。该函数参数 - a / 5 - 由调用者在重定向调用之前提供(在编译期间之前的方式) - 看到A的默认值,而不是B }的

如果你想要一些你似乎期望的东西,你可能会发现它有A::fun(int a = -1)或其他一些标记值,fun的实现检查sentinel值然后用5替换它或10根据需要。这样,特定于实现的值将在调用期间合并,而不是之前。

答案 1 :(得分:0)

默认参数不以动态调度行为为特征。它们是静态的。 Scott Meyers在“Effective C ++”

中详细讨论了这一点