抛砖引玉篇--多重继承
/ --*-- 2018.7.28 --*-- /
% 多继承存在的问题:
1)当多个基类中有相同名称的成员时,带来访问的混乱(二义性),同时也浪费了空间。
2) 如何让多个基类中的同名成员提取出来,成为共享资源,
这样,既不会造成访问混乱,又不会浪费空间。
% solution:虚基类 + 虚继承
c++提供的虚基类+ 虚继承机制可以实现:
在多个基类中的同名成员只有一份实体
%多重继承
=
note:
即使是没有成员的class object,其大小也不为0,具体影响其大小的,有以下三个因素:
1)语言本身所造成的额外负担:
为了支持c++对象模型,编译器会自动增加一些必要的额外开销。
例如上例中Parent01、Parent02为了能够索引到其virtual base class,编译器会插入一个指针,
指向其virtual base class object。
2)编译器对于特殊情况提供的优化处理:
对没有member的Grand,如果其大小为0,那如何为其class object分配空间呢?所以编译器为其插入了一个char。
对于Parent01来说,也没有member,但不必为其插入额外的char,
因为其已经有一个指向virtual base class object的指针。
- alignment的限制:
由于数据成员对齐的问题,会填补额外的字节,也是造成在不同场景下,大小的问题。
如上图:
对于一个含有virtual base class object的class,其内存空间将划分成两部分:不变部分和共享部分。
其中不变部分的offset将是固定的,不随后续的继承而移动,
所以可以对这部分成员直接存取。
但共享部分的offset将会随着继承而移动,
所以必须通过指针间接索引。
% 多重继承并不是一种优良的机制,c#和java已废除了该机制。
参考书籍 《Inside The Cpp Object Mordel》