避免调用基础构造函数2次

时间:2016-11-03 10:37:02

标签: c++ inheritance

假设我有几个继承的类。

#include <iostream>

struct A {
    A() {std::cout << "a";}
};

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

struct D : B, C {};

int main {
    D d;
}

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

3 个答案:

答案 0 :(得分:7)

如果BC都使用A D,那么每个struct B : virtual A {}; struct C : virtual A {}; //... D d; //prints "a" rather than "aa" 对象只会有一个基类对象:

integer

virtual inheritance

答案 1 :(得分:2)

如果您正在寻找非多态解决方案,那么您将失去运气。否则,请更改为以下内容:

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

答案 2 :(得分:1)

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

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