c ++多继承构造函数调用

时间:2012-04-11 09:24:01

标签: c++ inheritance

在以下行中,类A是基类,由类B和C继承。 D类继承自B和C.此外,D中的构造函数调用B,C和A的构造函数。 因为当B和C将A作为虚拟继承时,它们不能直接调用A的构造函数(因为必须通过第3代调用它)。

我的问题是,如果我想创建一个B类的对象,那么当A被虚拟继承时,无论如何都要调用A的构造函数(传递v1和v2,用于初始化的变量)?< / p>

class A {
   int a1,a2;
   A() {
   }

   A(int v1,v2) {
      a1 = v1;
      a2 = v2;
   }
};

class B:virtual public A {
   int b1,b2;
   B() {
   }

   B(int v1,v2) {
      b1 = v1;
      b2 = v2;
   }
};

class C:virtual public A {
   int c1,c2;
   C() {
   }

   C(int v1,v2) {
      c1 = v1;
      c2 = v2;
   }
};

class D:public B,public C {
   int d1,d2;
   D() {
   }

   D(int v1,v2):B(v1,v2),C(v1,v2),A(v1,v2)
   {
      d1 = v1;
      d2 = v2;
   }
};

2 个答案:

答案 0 :(得分:1)

同样可以为B提供A初始值设定项。所有虚拟继承意味着如果你有一个更加派生的对象,那么虚拟基础是由派生最多的对象构建的。但是,如果您只构建B的实例,则该实例最派生的对象。所以就这样写:

 class B : public virtual A
 {
 public:
     B() : A(1, 2) {  }
     // ...
 };

只有当派生自B 时才会忽略基本初始值设定项。

答案 1 :(得分:0)

你可以做的是让B和C从A继承正常(没有关键字'virtual'),但是使D类实际上从B和C进入。这将允许你创建B类对象(或者C)通过传递A类构造函数的值&gt;