避免调用基构造函数2次
Avoid calling base constructor 2 times
假设我有几个这样继承的类。
#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对象。这可能吗?
如果B
和C
都对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
子对象,尽管使用了B
和C
两个基,改变是使A
成为B
的虚基和C
的虚基。这样,在D
对象中只有一个A
子对象,并且A
的构造函数只在构造D
对象时运行一次。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何在派生构造函数中多次构造基类
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- C++:链接库两次,全局构造函数运行两次吗?
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 重载运算符 new(),为什么构造函数被调用两次?
- 复制构造函数被调用了多少次?
- Cython c++模块,多次调用构造函数
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 为什么这个构造函数被调用两次
- 为什么在此代码代码段中将复制构造函数两次称为两次
- 转发构造函数调用基类的复制构造函数2次
- 在使用Nifty Counter C++Idiom时,必须调用构造函数两次
- 类成员运算符new,调用构造函数两次
- 使c++编译器优化到在map初始化时只调用构造函数一次
- 避免调用基构造函数2次
- 为什么map.insert()方法调用复制构造函数两次?