【问题标题】:Mechanics of multiple inheritance compared to templates wrt building flexible designs多重继承机制与构建灵活设计的模板相比
【发布时间】:2015-12-12 15:56:46
【问题描述】:

这是 question 由于过于宽泛而被搁置的较窄版本。

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

在这样的设置中[即多重继承],[构建一个灵活的SmartPtr,]用户将通过继承一些BaseSmartPtr类和两个类来构建一个多线程、引用计数的智能指针类:MultiThreaded和@ 987654325@。任何有经验的类设计师都知道 这种幼稚的设计是行不通的。

...

  1. Mechanics. 没有样板代码可以将继承的组件组装到受控的 方式。唯一结合 BaseSmartPtr、MultiThreaded 和 RefCounted 的工具 是一种称为多重继承的语言机制。语言适用 组合基类的简单叠加,建立一套简单的规则 访问他们的成员。除了最简单的情况外,这是不可接受的。最多 当时,您需要仔细编排继承类的工作,以 获得所需的行为。

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

请注意,与 模板 相比,多重继承 的所有缺点都不是这里的答案,而只是 Andei 所说的 mechanics 的缺点> 在上面的引用中。特别是,请确保您不是在谈论 Andrei 列出的 多重继承 的另外两个弱点之一:

  1. 类型信息。基类没有足够的类型信息来进行 他们的任务。例如,假设您尝试为您的智能 通过从 DeepCopy 基类派生的指针类。但是 DeepCopy 会是什么接口 有?它必须创建它还不知道的类型的对象。

  2. 状态操作。用基类实现的各种行为方面必须操纵 相同的状态。这意味着他们必须使用虚拟继承来继承 保存状态的基类。这使设计复杂化并使其更加僵化,因为 前提是用户类继承库类,反之亦然。

【问题讨论】:

    标签: c++ templates multiple-inheritance policy-based-design


    【解决方案1】:

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

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

    template<class T>
    struct OpNewCreator
    {
      static T* Create()
      {
        return new T;
      }
    }; 
    

    ...

    >     //Library code
    >     template <class CreationPolicy>
    >     class WidgetManager:public CreationPolicy
    >     {
    >     ...
    >     };
    

    ...

    // Application Code
    typedef WidgetManager<OpNewCreator<Widget> > MyWidgetMgr;
    

    或者它可以使用模板模板参数(第 1.5.1 节)作为实现

    //Library Code
    template <template <class> class Creation Policy>
    class WidgetManager : public CreationPolicy <Widget>
    {
    ...
    }
    
    // Application Code
    typedef WidgetManager<OpNewCreator> MyWidgetMgr
    

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

    struct OpNewCreator
    {
      template <class T>
      static T* Create()
      {
        return new T;
      }
    

    }

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2011-04-06
      • 2017-01-05
      相关资源
      最近更新 更多