条款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?