C ++中的虚基类类空构造函数(C ++ 11)

时间:2013-06-29 13:15:28

标签: 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\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)

有人可以向我解释为什么在没有任何参数的情况下调用A类构造函数? 如果我希望B类从A虚拟继承,我还能如何“修复”这种行为? (如果继承不是虚拟的 - 样本工作正常)

1 个答案:

答案 0 :(得分:10)

在c ++ 03中,它是相同的。

始终从最终的叶类调用虚拟基础构造函数。 如果在实例化C时需要A的默认构造函数以外的其他东西,则必须在C类的构造函数中指定它。

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