C++ 多重继承构造函数调用

c++ multiple inheritence constructor calling

本文关键字:函数调用 多重继承 C++      更新时间:2023-10-16

在下面的行中,类A是基类,由类B和C继承。D类继承自B和C。此外,D 中的构造函数调用 B、C 和 A 的构造函数。因为当 B 和 C 继承 A 作为虚拟时,他们没有资格直接调用 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;
   }
};
也给

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

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

仅当您B派生时,才会忽略基本初始值设定项。

你可以做的是让类 B 和 C 从 A 正常继承(没有关键字"虚拟"),但使类 D 从 B 和 C 中虚拟继承。这将允许您通过传递类 A 构造函数的值来创建类 B(或 C)的对象>