Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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++;(C+;+;11)_C++_Class_Inheritance_C++11_Base Class - Fatal编程技术网

C++ 虚拟基类在C++;(C+;+;11)

C++ 虚拟基类在C++;(C+;+;11),c++,class,inheritance,c++11,base-class,C++,Class,Inheritance,C++11,Base Class,让我们看一下以下代码: class A{ protected: int _val; public: A(){printf("calling A empty constructor\n");} A(int val):_val(val){printf("calling A constructor (%d)\n", val);} }; class B: virtual public A{ public: B(){printf("calling B empty constructor\

让我们看一下以下代码:

class A{
protected:
  int _val;
public:
  A(){printf("calling A empty constructor\n");}
  A(int val):_val(val){printf("calling A constructor (%d)\n", val);}
};

class B: virtual public A{
public:
  B(){printf("calling B empty constructor\n");}
  B(int val):A(val){printf("calling B constructor (%d)\n", val);}
};

class C: public B{
public:
  C(){printf("calling C empty constructor\n");}
  C(int val):B(val){printf("calling C constructor (%d)\n", val);}
};

int main(void) {
  C test(2);
}
输出为:

calling A empty constructor
calling B constructor (2)
calling C constructor (2)
有人能给我解释一下为什么在没有任何参数的情况下调用类构造函数吗? 另外,如果我希望B类实际上从A继承,我如何“修复”这种行为?
(如果继承不是虚拟的,那么示例工作正常)

在c++03中也是一样的

虚拟基构造函数总是从最后一个叶类调用。 如果在实例化C时需要的不是A的默认构造函数,那么也必须在类C的构造函数中指定它

C(int val): A(val), B(val) {printf("calling C constructor (%d)\n", val);}

继承中的关键字
virtual
始终使构造函数调用基类的默认构造函数,即使您在声明中指定了非默认构造函数,基于基类将在继承树中多次显示并且您只希望调用一次构造函数的推断。还请注意,无论您指定的顺序如何,虚拟继承中的默认构造函数都会在普通继承中的构造函数之前调用。