多重继承——菱形继承(二义性)

菱形继承的定义如下,从Base出发,至AB汇合,因此成为菱形继承。

class Base;

class SubA : public Base;

class SubB : public Base;

class AB      : public SubA, public SubB;


这会导致两个问题:

       1.二义性 , 如果 Base定义了一个函数 fun, 在AB中调用fun时,编译器将不知道你想调用哪个fun,是从SubA继承的还是从SubB继承的呢?

       2.多个基类副本,SubA和SubB都含有Base的实例,这样,AB的实例中就存在两个Base实例,浪费了内存空间,继承链路越多,浪费的越多


处理方法:

       1.在AB调用Base的fun时,指明继承链路,如: AB ab;ab.SubA::fun(); 这样就祛除了二义性

       2.第一种方法能够祛除二义性,但基类的副本仍然是多个,这时就需要用到“虚继承

其用法就是在继承链路的中间层,加上virtual,将前面的代码改为如下定义:

class Base;

class SubA : virtual public Base;

class SubB : virtual public Base;

class AB      : public SubA, public SubB;

这时再编译 AB ab;ab.fun();就没问题了。

         使用虚继承,不仅可以祛除二义性,还可以使得Base实例在AB中只有一份。 



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值