这是由于过于宽泛而搁置的问题的较窄版本。
在Modern C++ Design的第 6-7 页上,Andrei Alexandrescu 列出了在构建灵活设计方面多重继承弱于模板的三种方式。特别是,他指出多重继承提供的机制很差(根据我对上下文的理解,方括号中的文本和格式是我的):
在这样的设置中[即多重继承],[构建一个灵活的,]用户将通过继承一些类和两个类
SmartPtr
来构建一个多线程、引用计数的智能指针类:和。任何有经验的类设计师都知道,这种幼稚的设计是行不通的。BaseSmartPtr
MultiThreaded
RefCounted
...
- 力学。没有样板代码可以以受控方式组装继承的组件。唯一结合 BaseSmartPtr、MultiThreaded 和 RefCounted 的工具是一种称为多重继承的语言机制。该语言在组合基类时应用了简单的叠加,并建立了一组访问其成员的简单规则。除了最简单的情况外,这是不可接受的。大多数时候,您需要仔细协调继承类的工作以获得所需的行为。
使用多重继承时,可以通过编写调用多个基类的成员函数的成员函数来实现一些非常灵活的编排。那么,多重继承中缺少并存在于模板中的编排是什么?
请注意,与模板相比,并不是多重继承的所有缺点都可以作为答案,而只是上面引用中 Andei 所谓的机制的缺点。特别是,请确保您不是在谈论Andrei 列出的其他两个多重继承弱点之一:
类型信息。基类没有足够的类型信息来执行它们的任务。例如,假设您尝试通过从 DeepCopy 基类派生来为您的智能指针类实现深度复制。但是 DeepCopy 会有什么接口呢?它必须创建它还不知道的类型的对象。
状态操纵。使用基类实现的各种行为方面必须操纵相同的状态。这意味着他们必须使用虚拟继承来继承持有状态的基类。这使设计复杂化并使其更加僵化,因为前提是用户类继承库类,反之亦然。