菱形继承概念
两个派生类继承同一个基类又有某个类同时继承者两个派生类这种继承被称为菱形继承,或者钻石继承
菱形继承产生的问题
- 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性.
- 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以
要解决问题1,仅需对需要访问的指定成员属性/函数添加加作用域区分即可
问题2的菱形继承导致资源浪费,需要使用虚继承的方式。
下面探讨虚继承的底层原理
对
sheep类
或tuo类
使用virtual
虚继承方式继承之后,在SheepTuo类
继承了sheep类
和tuo类
之后,在程序的底层,每个类在virtual
继承之后会产生一个vbptr
,即:虚基类指针vbptr
,vbptr
指向vbtable
虚基类表。
vbtable
记录的是数据的偏移量。在sheep类
和tuo类
进行虚继承之后,自身的vbptr
指向自身的vbtable
,但是两个vbtable
记录的偏移量在计算之后得到的最终地址,均指向同一份数据。
因此在使用虚继承解决菱形继承导致的资源浪费问题时,实际上继承之后,只有一份数据。