继承体系中基类的初始化顺序和什么有关?(类的继承顺序)
继承里面谁先被继承,则谁先被初始化
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,因为在继承体系里面,谁先被继承,则谁的类成员就会被先初始化。