首页 > 解决方案 > 虚拟继承对构造函数的影响

问题描述

我已经开始学习虚拟继承(以及它如何解决从具有相同父级的两个父类派生的类的问题)。为了更好地理解其背后的机制,我举了一个例子:

class A {
public: 
    A(string text = "Constructor A") { cout << text << endl; }
};

class B:  public A {
public:
    B(): A("A called from B") { cout << "Constructor B" << endl; }
};

class C : virtual public A {
public:
    C() : A("A called from C") { cout << "Constructor C" << endl; }
};

class D :  public B,  public C {
public: 
    D() { cout << "Constructor D" << endl; }
};

我有class Aclass B源自Aclass C实际上 源自Aclass D源自BC。在主要我只是形成一个对象class DD d;并且我得到以下输出

Constructor A
A called from B
Constructor B
Constructor C
Constructor D

困扰我的是,为什么有“构造函数 A”表示它不是由class Bor调用的C为什么在"Constructor C "之前没有"A called from C " 。对于后者,我知道它与虚拟派生有关,所以我猜它不会再次调用,因为对象 from已经形成(实际上是两次)。class CConstructor Aclass A

编辑:

主要我只制作一个对象类型D。

int main() {
  D d;
}

标签: c++inheritancemultiple-inheritancevirtual-inheritance

解决方案


首先,因为BA非虚拟派生,D最终有两个A子对象(好像你根本没有使用virtual继承)。

non-virtualAB()(因此"A called from B") 构造,virtual one 在构造时打印"Constructor A"

这是因为虚拟(可能是间接的)基类的构造函数总是由最派生类的构造函数(D)调用,而不是由任何中间基类的构造函数( )调用C

这意味着: A("A called from C")inC()被忽略(因为你没有构建一个独立的C)。并且由于在其成员初始化列表D()中没有提及,因此 virtual是在没有任何参数的情况下构造的(就像 by 一样)。AA: A()


此外,值得一提的是,所有虚拟基地都在非虚拟基地之前构建。

所以你的代码保证Constructor AA called from B.


推荐阅读