c++ - 虚拟继承对构造函数的影响
问题描述
我已经开始学习虚拟继承(以及它如何解决从具有相同父级的两个父类派生的类的问题)。为了更好地理解其背后的机制,我举了一个例子:
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 A
、class B
源自A
、class C
实际上 源自A
和class D
源自B
和C
。在主要我只是形成一个对象class D
:D d;
并且我得到以下输出
Constructor A
A called from B
Constructor B
Constructor C
Constructor D
困扰我的是,为什么有“构造函数 A”表示它不是由class B
or调用的C
。为什么在"Constructor C "之前没有"A called from C " 。对于后者,我知道它与虚拟派生有关,所以我猜它不会再次调用,因为对象 from已经形成(实际上是两次)。class C
Constructor A
class A
编辑:
主要我只制作一个对象类型D。
int main() {
D d;
}
解决方案
首先,因为B
从A
非虚拟派生,D
最终有两个A
子对象(好像你根本没有使用virtual
继承)。
non-virtualA
由B()
(因此"A called from B"
) 构造,virtual one 在构造时打印"Constructor A"
。
这是因为虚拟(可能是间接的)基类的构造函数总是由最派生类的构造函数(D
)调用,而不是由任何中间基类的构造函数( )调用C
。
这意味着: A("A called from C")
inC()
被忽略(因为你没有构建一个独立的C
)。并且由于在其成员初始化列表D()
中没有提及,因此 virtual是在没有任何参数的情况下构造的(就像 by 一样)。A
A
: A()
此外,值得一提的是,所有虚拟基地都在非虚拟基地之前构建。
所以你的代码保证Constructor A
在A called from B
.
推荐阅读
- javascript - 在对象数组上使用 indexOf
- django - 寻找适用于 Python Django 的最佳且易于设置的通知处理程序应用程序
- python - 使用来自 Python 的 MEGAdrop 文件夹(无需登录)链接上传文件
- c# - 下拉列表中的 Asp.net MVC 多个字段无法回发到数据库
- php - 如何将多行 json 数组转换为 php 对象数组以访问该数组的属性
- python - TensorFlow MTCNN 模型能否转成 TensorFlow Lite 格式?
- android - ffmpeg在没有输入时丢弃会话,需要等待输入
- java - 在使用 TestNg ITestResult 接口或任何其他 testNg 接口执行测试后,如何调用 TestNg @Test 方法的输入参数的实例
- javascript - VueJS v-if with 方法总是返回 false
- java - 为同一个字段设置多个设置器是一个好的设计吗?