考虑如下代码:
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``"的两相结合