抛砖引玉篇--多重继承

 

/ --*-- 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的指针。

 

  1. alignment的限制

         由于数据成员对齐的问题,会填补额外的字节,也是造成在不同场景下,大小的问题。

 

抛砖引玉篇--多重继承

抛砖引玉篇--多重继承

 

如上图:

对于一个含有virtual base class object的class,其内存空间将划分成两部分:不变部分共享部分

其中不变部分的offset将是固定的,不随后续的继承而移动,

所以可以对这部分成员直接存取。

但共享部分的offset将会随着继承而移动,

所以必须通过指针间接索引。

 

% 多重继承并不是一种优良的机制,c#和java已废除了该机制。

 

参考书籍  《Inside The Cpp Object Mordel》