我偶然发现了这个代码示例:
#include <iostream>
using namespace std;
class A {
int x;
public:
A() { x = 1; cout << "A"; }
};
class B : virtual public A {
int y;
public:
B() { y = 2; cout << "B"; }
};
class C : virtual public B, virtual public A {
int z;
public:
C() { z = 3; cout <<"C"; }
};
class D : public A, public B, public C {
int t;
public:
D() { t = 4; cout << "D"; }
};
int main()
{
D d;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码打印出来ABABCD,我不明白为什么.我认为这将打印A的D : public A,然后AB对D : public B,然后ABC对D : public C,然后D,但似乎A只打印了两次.这是如何运作的?
当在继承关系中键入时,基础的构造顺序是(忽略虚拟基础)从左到右.一旦你添加虚拟基地,这些被初始化首先在深度优先左到右的方式(任何非虚基前).
现在这应该解释输出.
D:A,B,C
A没有虚拟基数,B有一个虚拟A基,所以这是第一次初始化:"A".然后C有一个虚拟B基,所以这是下一个被初始化.此时,A虚拟子对象已经初始化,因此只有B构造函数被评估为"AB".此时,构建了所有虚拟基础并构建了非虚拟基础,首先是A,然后是B,然后是C,然后是完整类型D,产生"ABABCD".虚拟子对象都已构造完毕,因此不会再构造它们.
要记住一些事情.虚拟基础仅与愿意共享它的其他子对象共享(即将其作为虚拟基础).在完整对象中共享虚拟基础的次数没有限制(即,多次共享虚拟基础,包括来自不同B子对象的虚拟基础)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |