1

请帮我找出背后的原因:

#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,为什么以及如何工作。?

4

2 回答 2

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

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

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

于 2013-02-08T06:43:10.883 回答
0

默认参数不以动态调度行为为特征。它们是静态的。Scott Meyers 在“Effective C++”中详细讨论了这一点

于 2013-02-08T06:43:45.130 回答