💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## 条款40:明智而审慎地使用多重继承 Use multiple inheritance judiciously. 对于多重继承(multiple inheritance;MI),有两个基本阵营:一是认为单一继承(single inheritance;SI)是好的,多重继承也一定更好;另一种主张单一继承是好的,但多重继承不值得拥有。 当MI 进入设计景框,程序有可能从一个以上的 base classes 继承相同的名称,这将导致歧义(ambiguity)。 ```cpp class BorrowableItem { public: void checkOut(); }; class ElectronicGadget { public: void checkOut(); }; class MP3Player: public BorrowableItem, public ElectronicGadget { ... } // 继承了两个 checkOut; ``` ### 砖石型多重继承 ```cpp class File { ... }; class InputFile: public File { ... }; class OutputFile: public File { ... }; class IOFile: public InputFile, public OutputFile { ... }; ``` 砖石型多重继承的缺省做法是执行复制,所以 IOFile 内会有两份 File 的成员变量,解决的办法是用 ”virtual 继承”: ```cpp 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,如果必须使用,则尽可能避免在其中放置数据。