首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >相对于模板wrt构建灵活设计的多重继承机制

相对于模板wrt构建灵活设计的多重继承机制
EN

Stack Overflow用户
提问于 2015-09-16 07:26:11
回答 1查看 266关注 0票数 4

这是由于question太宽而被搁置的更窄的版本。

现代C++设计的第6-7页上,Alexandrescu列出了在构建灵活设计方面多重继承比模板弱的三种方式。他特别指出,多重继承提供的机制很差(根据我对上下文的理解,方括号中的文本和格式是我的):

在这种情况下,即多重继承,为了构建一个灵活的SmartPtr,用户将通过继承一些BaseSmartPtr类和两个类:MultiThreadedRefCounted,构建一个多线程、引用计数的智能指针类。任何有经验的类设计人员都知道,这种天真的设计是行不通的。 ..。

  1. 机械师。没有样板代码可以以受控的方式组装继承的组件。唯一将BaseSmartPtr、MultiThreaded和RefCounted结合在一起的工具是一种称为多重继承的语言机制。该语言在组合基类时应用简单的叠加,并为访问它们的成员建立了一组简单规则。除了最简单的情况外,这是不可接受的。在大多数情况下,您需要精心编排继承类的工作,以获得所需的行为。

在使用多重继承时,可以通过编写调用多个基类成员函数的成员函数来实现一些相当灵活的编排。那么,在多继承中缺少并在模板中呈现的业务流程是什么呢?

请注意,与模板相比,多重继承并不是所有的缺点都可以作为答案,但是在上面的引用中,Andei所说的机制只是一个缺点。特别是,请确保您不是在谈论Andrei列出的多重继承的另外两个弱点之一:

  1. 输入信息。基类没有足够的类型信息来执行其任务。例如,假设您试图通过从DeepCopy基类派生来为您的智能指针类实现深度复制。但是DeepCopy会有什么接口呢?它必须创建一个还不知道的类型的对象。
  2. 国家操纵。使用基类实现的各种行为方面必须操作相同的状态。这意味着他们必须使用虚拟继承来继承包含状态的基类。这使得设计变得更加复杂,因为前提是用户类继承库类,而不是相反。
EN

回答 1

Stack Overflow用户

发布于 2015-10-07 09:32:47

我认为Alexandrescu在“力学”一段中所指的是在本章的其余部分中阐述的。他指的是基于策略的类设计比基于继承的类设计要灵活得多,特别是在实现和组合策略的各种方式方面,这与通过多重继承所允许的单一实现和组合相比更加灵活。

例如,在讨论Creator策略时,他指出该策略只需要一个Create()方法,该方法返回要创建的类的指针,但没有指定它是虚拟的还是非静态的。他还展示了创建每个策略的几种方法:一个简单的策略类,比如(来自1.5节,跳过MallocCreator和PrototypeCreator策略)

模板结构OpNewCreator { static * Create() {返回新T;}; ..。

代码语言:javascript
运行
复制
>     //Library code
>     template <class CreationPolicy>
>     class WidgetManager:public CreationPolicy
>     {
>     ...
>     };

..。 //应用代码类型为WidgetManager MyWidgetMgr;

也可以使用模板模板参数(1.5.1节)实现

//库代码模板<模板类创建Policy>类WidgetManager :公共CreationPolicy {.}//应用程序代码类型WidgetManager MyWidgetMgr

或(第1.5.2节)-作为模板成员函数实现:

结构OpNewCreator {模板静态T* Create() {返回新T;}

}

这些是在基于模板的策略类解决方案中可用而在多继承解决方案中不可用的灵活机制的示例。这些特殊的例子也许并不那么令人兴奋,可能是因为由于教学上的原因,它们必须简短而简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32602235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档