请帮我找一下背后的原因:
#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,为什么以及如何工作。?
答案 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 ++”
中详细讨论了这一点