继承体系中基类的初始化顺序和什么有关?(类的继承顺序)

继承里面谁先被继承,则谁先被初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class A {
public:
A(const char* s) { cout << s << endl; }
~A() {}
};
class B : virtual public A
{
public:
B(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class C :virtual public A
{
public:
C(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class D :public B, public C//继承顺序
{
public:
D(const char* s1, const char* s2, const char* s3, const char* s4) :B(s1, s2), C(s1, s3), A(s1)
{
cout << s4 << endl;
}
};
int main() {
D* p = new D("class A", "class B", "class C", "class D");

delete p;
return 0;
}

这道题的输出结果是”class A”, “class B”, “class C”, “class D”,首先这是一个菱形虚拟继承,那么A类的成员变量在D成员中只会出现一份,因为菱形虚拟继承可以解决数据冗余和二义性的问题,那么即使B和C和D里面都初始化了A,但A肯定只会被初始化一次,因为我们知道,赋值可以被赋值多次,但初始化只能初始化一次。那么该用BCD的谁来初始化A呢?答案是用D来初始化A,因为在继承体系里面,谁先被继承,则谁的类成员就会被先初始化。