虚继承 构造顺序

如下的菱形结构,四个字母分别表示一个类名

      A
  B    C
      D

说明:B和C均继承A, D继承B和C

下面是我调试的5种情况的结果,请大家帮忙分析一下:

1. 若所有继承均为普通继承,则构造函数的调用顺序如下:A B A C D
2. 若仅仅A->B为虚继承,则构造函数的调用顺序如下:A B A C D
3. 若仅仅A->C为虚继承,则构造函数的调用顺序如下:A A B C D
4. 若仅仅B->D为虚继承,则构造函数的调用顺序如下:A B A C D
2. 若仅仅C->D为虚继承,则构造函数的调用顺序如下:A C A B D

虚继承应该是最终子类优先执行虚继承的基类的构造函数,然后再按正常顺序调用各构造函数

像第3种情况,C虚继承A,其执行顺序为:
1、D->A:D类先执行虚继承的基类A的构造函数
2、D->B->A:D类再执行直接父类B的构造函数,而B则先执行直接父类A的构造函数
3、D->C->(A):D类再执行直接父类C的构造函数,而C本来应该先执行直接父类A的构造函数,但由于虚继承,A的构造函数在第1步已经执行过了,故不再执行
故最终的顺序为AABCD

像第5种情况,D虚继承C,其执行顺序为:
1、D->C->A:D类先执行虚继承的基类C的构造函数,而C则先执行直接父类A的构造函数
2、D->B->A:D类再执行直接父类B的构造函数,而B则先执行直接父类A的构造函数
3、D->(C):D类再执行直接父类C的构造函数,但由于虚继承,C的构造函数在第1步已经执行过了,故不再执行
故最终的顺序为ACABD


6. 若A->B为虚继承,同时A->C也为虚继承,则构造函数的调用顺序如下:A B C D
其执行顺序为:
1、D->A:D类先执行虚继承的基类A的构造函数
2、D->B->(A):D类先执行虚继承的基类B的构造函数,而B则先执行直接父类A的构造函数,但由于虚继承,A的构造函数在第1步已经执行过了,故不再执行
3、D->C->(A):D类再执行直接父类C的构造函数,而C则先执行直接父类A的构造函数,但由于虚继承,A的构造函数在第1步已经执行过了,故不再执行
故最终的顺序为ABCD

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值