Part6 继承与OOD Inheritance and Object-Oriented Design(三)

Rule40:明智使用多重继承 Use mutiple inheritance judiciously
最先遇到的一个问题是,当MI进入设计时,程序有可能从一个以上的base classes继承相同名称(如函数、typedef等等),那会导致较多的歧义机会。
这里写图片描述
上面代码中对checkOut的调用是歧义的,即使两个函数之中只有一个可取用(BorrowwableItem内的checkOut是public,ElectronicGadget内的却是private)。这与C++用来解析重载函数调用的规则相符:在看到是否有个函数可取用之前,C++首先确认这个函数对此调用之言是最佳匹配。找到最佳匹配函数后才检验其可取用性,本例的两个checkOuts有相同的匹配程度,没有所谓的最佳匹配。
这里写图片描述
可以看出在编译环节编译器就报错。
为了解决这个歧义,你必须明白指出你要调用哪一个base class内的函数:
mp.BorrowableItem::checkOut();
mp.ElectronicGadget::checkOut();//此时才会提示访问权限不够

钻石型多重继承
这里写图片描述
这种情况下,假设File class有个成员变量fileName,那么IOFile内该有多少笔这个名称的数据呢?从某个角度说,IOFile从其每一个base class继承一份,所以其对象内应该有两份fileName成员变量。但从另一个角度说,IOFile对象本应该只有一个文件名称,所以它继承自两个base classes而来的fileName不该重复。
C++在这个上面没有倾斜立场:两个方案都支持,默认做法是执行复制,也就是上面的第一种做法。如果那不是你想要的,你必须令那个带有此数据的class(也就是File)成为一个虚基类(virtual base class)。为了这样做,你必须令所有直接继承自它的classes采用“虚继承”。
这里写图片描述

但是 virtual base class的构造需要性能上的消耗,对virtual base class 的忠告很简单。第一,非必要不使用virtual bases。平常请使用non-virtual 继承。第二,如果你必须使用virtual base classes,尽可能避免在其中放置数据。这么一来就不用担心这些classes身上的初始化和赋值带来的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值