假设我有几个继承的类。
#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对象。这可能吗?
答案 0 :(得分:7)
如果B
和C
都使用A
D
,那么每个struct B : virtual A {};
struct C : virtual A {};
//...
D d; //prints "a" rather than "aa"
对象只会有一个基类对象:
integer
答案 1 :(得分:2)
如果您正在寻找非多态解决方案,那么您将失去运气。否则,请更改为以下内容:
struct B : virtual A {};
struct C : virtual A {};
答案 2 :(得分:1)
如上所述,每个D
对象都有两个类型为A
的子对象,一个继承自类B
,另一个继承自类C
。因此,A
的构造函数必须运行两次,每个子对象运行一次。
如果原始设计错误,并且应该只有一个A
子对象,尽管使用了两个基础B
和C
,但更改是A
1}} B
的虚拟基础和C
的虚拟基础。这样,A
对象中只有一个D
子对象,A
的构造函数只会在构造D
对象时运行一次。