Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚函数中的默认参数_C++_Virtual Functions_Default Arguments - Fatal编程技术网

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();