因为这种继承形似菱形因此称の为菱形继承,或者钻石继承
这里的Son到底跟谁姓,它有两个姓一个是Father的姓,一个是Mother的姓所以在给Son.First_Name成员赋值时候必须加限定,否则存茬二义性问题
菱形继承还可能存在数据冗余问题,即在Son类里有两份First_Name数据,那么我到底是不是需要两份数据呢如果不需要就显得繁琐冗余,大多数情况不需要的
虚继承又称之为菱形虚拟继承。在继承关系前加virtualGrandfather类被称为虚基类。为了解决菱形继承的二义性与数据冗余問题引进了虚继承的概念。
那么我们看看下面这段代码
上述说明对象s中只存在一个a都是Grandfather中的a
那结果为什么会是24,不是應该是16吗
既然知道了虚基类的偏移量的位置,那么我再打开两个内存看到了这两个偏移量Father类的虚基类的偏移量是(14)H=(20)D。Mother的虚基类嘚偏移量是(0c)H=(12)D20-12=8个字节,而虚基表指针位置Mother-Father=0096FEF0-0096FEE8=8字节说明这两个虚继类是同一个虚基类就是我们的GrandFather。
很多人说C++语法复杂其实多继承就是一個体现。有了多继承就存在菱形继承,有了菱形继承就有菱形虚拟继承底层实现就很复杂。所以一般不建议设计出多继承一定不要設计出菱形继承。在复杂度及性能上都有问题