条款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``"的两相结合
上一篇:gradle 修改生成的apk的名字


下一篇:Spark 详解