C++ 虚函数中的默认参数
请帮我找出背后的原因:C++ 虚函数中的默认参数,c++,virtual-functions,default-arguments,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<
#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;
}
#包括
使用std::cout;
甲级{
公众:
虚空乐趣(inta=5){cout
在这段代码中,fun()
以多态方式调用-调用者使用(仅)关于A::fun()
的知识,但调用被调度到一个指针,该指针重定向到B::fun()
的实现。不过,该函数参数-A
/5
是在重定向调用之前由调用者提供的(方式在编译之前-编译期间)
A的默认值可见,而不是B
如果您想要像您期望的那样的东西,您可能会发现拥有A::fun(inta=-1)是有效的
或其他一些sentinel值,通过fun
的实现检查sentinel值,然后根据需要将其替换为5或10。这样,特定于实现的值将在调用期间合并,而不是之前
在这段代码中,fun()
以多态方式调用-调用者使用(仅)关于A::fun()
的知识,但调用被调度到一个指针,该指针重定向到B::fun()
的实现。不过,该函数参数-A
/5
是在重定向调用之前由调用者提供的(方式在编译之前-编译期间)A的默认值可见,而不是B
如果您想要像您期望的那样的东西,您可能会发现拥有
A::fun(inta=-1)是有效的
或其他一些sentinel值,实现fun
检查sentinel值,然后根据需要将其替换为5或10。这样,特定于实现的值将在调用过程中合并,而不是在调用之前。默认参数的特征不是动态调度行为。它们是静态的。
Scott Meyers在“有效的C++”中详细讨论了这一点。默认参数不是以动态调度行为为特征的,而是静态的。
Scott Meyers在“有效的C++”中详细讨论了这一点。yes@Mark,我使用的是MS VC++2010 Express yes@Mark,我使用的是MS VC++2010 Express
A *obj = new B();
obj->fun();