虚基类初始化问题

Posted 小菜鸡y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚基类初始化问题相关的知识,希望对你有一定的参考价值。

在包含有继承关系的类里,生成一个派生类对象,要调用构造函数进行初始化此对象,而构造函数的调用顺序是先调用最顶层基类的构造函数,次顶层....等;但在普通继承和虚继承里存在区别

  • 普通继承:父类只能由其直接派生类初始化

技术分享

 1 class A
 2 {
 3     char a;
 4 public:
 5     A(char _a) :a(_a){ cout << a << endl; }
 6 };
 7 
 8 class B:public A
 9 {
10     char b;
11 public:
12     B(char _a, char _b) :A(_a),b(_b){ cout << b << endl; }
13 };
14 
15 class C:public A
16 {
17     char c;
18 public:
19     C(char _a,char _c) :A(_a),c(_c){ cout << c << endl; }
20 };
21 
22 class D:public B,public C
23 {
24     char d;
25 public://注意初始化列表,父类只能由其直接派生类初始化,若初始化列表是:A(_a),B(_b),C(_c),D(_d),则出错
26     D(char _a,char _b,char _c,char _d):B(_a,_b),C(_a,_c),d(_d){ cout << d << endl; }
27 };
28 
29 void main()
30 {
31     D d(A,B,C,D);
32 }

技术分享

虚继承:

技术分享

基类只能由最底层的派生类初始化,而不是由直接基类初始化,因为虚继承是为了避免多重继承产生的,只能存在一个子对象,所以只能初始化一次,而在多继承里,一个基类可能存在多个直接派生类,为了避免直接派生类多次初始化基类,只能由最底层的派生类来初始化。

 1 class A
 2 {
 3     char a;
 4 public:
 5     A(char _a) :a(_a){ cout << a << endl; }
 6 };
 7 
 8 class B :virtual public A
 9 {
10     char b;
11 public:
12     B(char _a, char _b) :A(_a), b(_b){ cout << b << endl; }
13 };
14 
15 class C :virtual public A
16 {
17     char c;
18 public:
19     C(char _a, char _c) :A(_a), c(_c){ cout << c << endl; }
20 };
21 
22 class D :public B, public C
23 {
24     char d;
25 public://初始化列表里包含A(_a),表示虚基类由最底层派生类初始化
26     D(char _a, char _b, char _c, char _d) :A(_a), B(_a,_b), C(_a,_c), d(_d){ cout << d << endl; }
27 };
28 void main()
29 {
30     D d(A,B,C,D);
31 }

技术分享

这里说的最底层是指对象的层级

如B b,则B是A的最底层派生类,由b负责初始化b中所包含的A的子对象

D d,则D是A的最底层派生类,由d负责初始化A的子对象

以上是关于虚基类初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

C++虚基类初始化

虚基类初始化问题

C++不是说虚基类构造函数只被调用一次吗?

虚基类 和 虚函数

理解虚基类多重继承的问题

理解虚基类多重继承的问题