菱形继承

来源:互联网 发布:java accept 编辑:程序博客网 时间:2024/04/27 09:49

菱形继承

编辑词条分享

请用一段简单的话描述该词条,马上添加摘要。

 考虑这种情况:


class CA{};

class CB : public CA{};

class CC : public CA{};

这时我们需要一个CD类,它需要同时继承CB和CC。

问题就出现了。

如果我们这样写:

class CD : public CB, public CC{};

那么我们在构造一个CD类的时候,

其结果如下图一所示:
图一图一
即:一个CD类中有两个CA(它的超类的对象)

这样的情况是不合理的。此时会出现模糊调用的现象。

如何避免这种现象呢?

虚继承就有了用武之地。

我们需要改写CB和CC的继承方式。

class CB : public virtuel CA{};

class CC : public virtual CA{};

其他无需修改。此时我们构造一个CD类的时候,

其顺序如下:

开始构造CD类,

先构造一个超类CA,然后构造CB,

在构造CC(此时不会构造CC的父类CA)

这样一来,

CD类对象中包含的CB和CC将共享同一份CA对象。

  如图二所示图二图二
这时就不会出现模糊调用的现象了。

-----------------------------------华丽丽的分割线--------------------------------------

这个就是C++臭名昭著的多继承。

在JAVA中根本不会出现这种情况,

如果必须使用菱形继承的时候无比使用虚拟继承。