虚继承的底层原理

菱形继承概念

两个派生类继承同一个基类又有某个类同时继承者两个派生类这种继承被称为菱形继承,或者钻石继承

菱形继承产生的问题

在这里插入图片描述

  1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性.
  2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以

要解决问题1,仅需对需要访问的指定成员属性/函数添加加作用域区分即可
问题2的菱形继承导致资源浪费,需要使用虚继承的方式。

下面探讨虚继承的底层原理

sheep类tuo类使用virtual虚继承方式继承之后,在SheepTuo类继承了sheep类tuo类之后,在程序的底层,每个类在virtual继承之后会产生一个vbptr,即:虚基类指针vbptrvbptr指向vbtable虚基类表。
vbtable记录的是数据的偏移量。在sheep类tuo类进行虚继承之后,自身的vbptr指向自身的vbtable,但是两个vbtable记录的偏移量在计算之后得到的最终地址,均指向同一份数据。

因此在使用虚继承解决菱形继承导致的资源浪费问题时,实际上继承之后,只有一份数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

colorful_stars

您是我见过全宇宙最可爱的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值