当前位置首页 > 百科资料> 正文

菱形继承

2022-07-09 20:14:56 百科资料

定义:两个子类继承同一个父类,而又有子类同时继承这两个子类。

  • 中文名称 菱形继承
  • 定义 使用菱形继承时务必使用虚拟继承
  • 程序 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。

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net