避免调用基构造函数2次

Avoid calling base constructor 2 times

本文关键字:构造函数 2次 调用      更新时间:2023-10-16

假设我有几个这样继承的类。

#include <iostream>
struct A {
    A() {std::cout << "a";}
};
struct B : A {};
struct C : A {};
struct D : B, C {};
int main {
    D d;
}

在执行程序时,如预期的那样,我看到构造了两个A对象,一个用于B,另一个用于C对象,这两个对象是在创建D对象时构造的。我怎么能不创建两个A对象呢?我想用相同的A对象来创建B和C对象。这可能吗?

如果BC都对A使用虚拟继承,那么每个D对象将只有一个基类对象:

struct B : virtual A {};
struct C : virtual A {};
//...
D d; //prints "a" rather than "aa" 

现场演示

如果您正在寻找非多态解决方案,那么您就不走运了。否则,修改为:

struct B : virtual A {};
struct C : virtual A {};

如前所述,每个D对象都有两个类型为A的子对象,一个继承自类B,另一个继承自类C。因此A 的构造函数必须运行两次,每个子对象运行一次。

如果原来的设计是错误的,应该只有一个A子对象,尽管使用了BC两个基,改变是使A成为B的虚基和C的虚基。这样,在D对象中只有一个A子对象,并且A的构造函数只在构造D对象时运行一次。