条款40: 明智而审慎地使用多重继承

考虑如下代码:

class BorrowableItem {	// 图书馆允许你借某些东西
public:
	void checkout();		// 离开时检查
	// ...
};

class ElectronicGadget {
private:
	bool checkout() const;	// 执行自我检测,返回是否检测成功
};

// 多继承
class Mp3Player : public BorrowableItem, public ElectronicGadget {
	// ...
};

MP3Player mp;
mp.checkOut();	// 歧义,调用的是哪个checkout?

为了解决这个歧义,你必须明白指出你要调用哪一个base class内的函数:

mp.BorrowableItem::checkOut();

当遇到钻石继承时候的情况呢?考虑如下代码:

class File {};
class InputFile : public File {};
class OutputFile : public File {};
class IOFile : public InputFile, public OutputFile{};

如果File class有个成员变量filenName,那么IOFile内该有多少笔这个名称的数据(一或者二份?),C++的缺省做法是执行复制(2份);如果这不是你想要的,你必须令那个带有数据的class(也就是File)成为一个virtual base class:

class File {};
class InputFile : virtual public File {};
class OutputFile : virtual public File {};
class IOFile : public InputFile, public OutputFile{};

但是要注意到:使用virtual继承那些classes所产生的对象往往比使用non-virtual继承的体积大,访问virtual base classes的成员变量时,也比访问non-virtual base classes的成员变量速度慢;

  • 多重继承的确有正当用途;其中一个情节涉及"public 继承某个Interface class"和"private继承某个协助实现的`class``"的两相结合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值