条款40:明智而审慎地使用多重继承
Use multiple inheritance judiciously.
对于多重继承(multiple inheritance;MI),有两个基本阵营:一是认为单一继承(single inheritance;SI)是好的,多重继承也一定更好;另一种主张单一继承是好的,但多重继承不值得拥有。
当MI 进入设计景框,程序有可能从一个以上的 base classes 继承相同的名称,这将导致歧义(ambiguity)。
class BorrowableItem {
public:
void checkOut();
};
class ElectronicGadget {
public:
void checkOut();
};
class MP3Player:
public BorrowableItem,
public ElectronicGadget { ... } // 继承了两个 checkOut;
砖石型多重继承
class File { ... };
class InputFile: public File { ... };
class OutputFile: public File { ... };
class IOFile: public InputFile, public OutputFile { ... };
砖石型多重继承的缺省做法是执行复制,所以 IOFile 内会有两份 File 的成员变量,解决的办法是用 ”virtual 继承”:
class File { ... };
class InputFile: virtual public File { ... };
class OutputFile: virtual public File { ... };
class IOFile: public InputFile, public OutputFile { ... };
virtual 继承的成本会较高:
使用 virtual 继承的那些 classes 所产生的对象往往比使用 non-virtual 继承的体积要大;
访问 virtual base classes 成员变量时,也比访问 non-virtual base classes 的成员变量速度慢;
virtual base classes 初始化由继承体系中的最低层(most derived)class 负责;
所以对于 virtual base class,非必要不使用 virtual bases,如果必须使用,则尽可能避免在其中放置数据。
Last updated
Was this helpful?