菱形继承
定义:两个子类继承同一个父类,而又有子类同时继承这两个子类。
- 中文名称 菱形继承
- 定义 使用菱形继承时务必使用虚拟继承
- 程序 C++
菱形继承
考虑这种情况:
classCA{};
classCB:publicCA{};
classCC:publicCA{};
这时我们需要一个CD类,它需要同时继承CB和CC。
问题就出现了。
如果我们这样写:
classCD:publicCB,publicCC{};
那么我们在构造一个CD类的时候,
其结果
如下图一所示:
图一 |

即:一个CD类中有两个CA(它的超类的对象)
这样的情况是不合理的。此时会出现模糊调用的现象。
如何避免这种现象呢?
虚继承就有了用武之地。
我们需要改写CB和CC的继承方式。
classCB:publicvirtuelCA{};
classCC:publicvirtualCA{};
其他无需修改。此时我们构造一个CD类的时候,
其顺序如下:
开始构造CD类,
先构造一个超类CA,然后构造CB,
在构造CC(此时不会构造CC的父类CA)
这样一来,
CD类对象中包含的CB和CC将共享同一份CA对象。
如图二所示

这时就不会出现模糊调用的现象了。
-----------------------------------华丽丽的分割线--------------------------------------
这个就是C++臭名昭著的多继承。
在JAVA中根本不会出现这种情况,
如果必须使用菱形继承的时候务必使用虚拟继承。
虚继承
虚继承 这一特性在多重继承应用中非常有用,可以使得虚基类对于由它直接或间接派生的类来说,拥有一个共同的基类对象实例。避免由于带有歧义的组合而产生的问题(如"菱形继承问题")。其原理是,间接派生类(C)穿透了其父类(上面例子中的A与B),实质上直接继承了虚基类X。