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