0

在下面几行中,类 A 是基类,由类 B 和 C 继承。类 D 继承自 B 和 C。此外,D 中的构造函数调用 B、C 和 A 的构造函数。因为当 B 和 C 继承 A 时virtual,它们没有资格直接调用 A 的构造函数(因为必须通过第 3 代调用相同的构造函数)。

我的问题是,如果我想创建一个 B 类的对象,那么由于 A 是虚拟继承的,是否有调用 A 的构造函数(传递 v1 和 v2,用于初始化的变量)?

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;
   }
};
4

2 回答 2

1

也可以BA. 虚拟继承意味着,如果你有一个更派生的对象,那么虚拟基是由最派生的对象构造的。但是,如果您只构建 的实例B,则该实例最派生的对象。所以就这样写吧:

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

只有当您从中派生时B,才会忽略基本初始化程序。

于 2012-04-11T09:28:52.837 回答
0

您可以做的是使 B 类和 C 类从 A 正常继承(没有关键字“virtual”),但使 D 类虚拟地从 B 和 C 继承。这将允许您通过以下方式创建 B 类(或 C)的对象为 A 类构造函数传递值>

于 2012-04-11T09:30:17.857 回答