多重继承的机制与构建灵活设计的模板相比

2024-04-09

这是一个更窄的版本question https://stackoverflow.com/questions/32549573/understanding-the-exposition-of-alexandrescu-about-the-weaknesses-of-multiple-in由于范围太广而被搁置。

在第 6-7 页现代 C++ 设计,Andrei Alexandrescu 列出了三种方式多重继承弱于模板关于构建灵活的设计。他特别指出,力学由...提供多重继承很差(方括号中的文本和格式是我的my理解上下文):

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

...

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

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

请注意,并非所有缺点多重继承相比模板这里作为一个答案,但只是 Andei 所说的一个缺点力学在上面的引用中。特别是,请确保您没有谈论其他两个弱点之一多重继承安德烈列出:

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

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


我认为 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;
  }

}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多重继承的机制与构建灵活设计的模板相比 的相关文章

随机推荐

  • C# 保存大图像

    我在尝试使用 C 保存巨大图像 我指的是超过 1 GB 时遇到了困难 基本上 我尝试分部分执行此操作 我有大约 200 个位图源 我需要一种方法在将它们编码为 png 文件之前或之后将它们组合起来 我知道这将需要大量的 RAM 除非我以某种
  • 观察非 ember 全局变量

    我想要一个计算属性来观察非 ember 全局 localStorage 中的特定键 这可能吗 以下似乎并没有削减它 someProperty function some functionality property localStorage
  • 有没有办法忽略文本文件中某些行的读取?

    我正在尝试读取 C 应用程序中的文本文件 但我不想读取前两行或最后一行 文件中有 8 行 所以实际上我只想读取第 3 4 5 6 和 7 行 有什么办法可以做到这一点吗 示例文件 USE Shelley s Other Database C
  • 膨胀类 CollapsingToolbarLayout 时出错

    我的 CollapsingToolbarLayout 由于错误膨胀类 android support design widget CollapsingToolbarLayout 而崩溃 我上周末更新了android studio 更新之前
  • 如何删除firebase中具有指定标题的特定记录

    我在 Web 应用程序中使用 Firebase 数据库 并且有这样的数据 如何删除标题中包含 Apple 的整个记录 图中标记 我写了下面的代码 但它不起作用 请帮助 var abc firebase database ref fireba
  • 如何使用 Selenium Server 2.20 获取执行服务器名称或地址

    使用 Selenium Server 时 记录实际执行 selenium 脚本的计算机的名称非常有用 是否可以获得该信息 我正在使用 C 绑定 但用任何语言回答都可以 我们应该知道 Selenium 服务器在哪里运行 这是Java代码 我们
  • Android 应用内结算可用产品列表

    是否可以通过某种方式从 Play 商店获取所有可用产品的列表 我想要做的是获取所有可用的项目 然后将它们显示在 ListView 中 每当有人点击 ListView 时 就会在 Google Play 商店中打开正确的项目 那可能吗 如果是
  • 仅当其中一个流发生更改时,combineLatest 才会发出

    我有一个具有频繁值的流和一个具有较慢值的流 我想将它们组合起来 但仅当较慢的发出时才发出一个值 所以combineLatest不起作用 就像这样 a1 a2 b1 a2 b1 a3 a4 a5 b2 a5 b2 目前我正在这样做 有没有更干
  • 针对大型文件夹的并行 tar 和分割

    我有一个非常大的文件夹 我想对其进行 gzip 压缩并拆分以进行存档 bin bash dir 1 name 2 size 32000m tar czf dev stdout dir split a 5 d b size name 有没有办
  • 将列联表从 R 导出到 Excel 的最有效方法

    我正在 R 中创建一些列联表 交叉表 我想将其移动到 Excel 以在 Word 文档中使用 我发现了关于如何在几个问题中表现出色的讨论 如何将多元预测结果从 R 导出到 Excel https stackoverflow com ques
  • 在特定版本中测试 python 脚本

    我目前在我的 Mac 上安装了 Python 2 6 2 我正在编写一个必须在 Python 2 5 2 上运行的脚本 所以我想编写一个 python 脚本 并且测试专门针对 2 5 2 而不是 2 6 2 我正在查看 virtualenv
  • 不弹出标准对话框

    我有一个带有 TSaveDialog 的表单 当调用 Execute 函数时 从 IDE 运行时它不会弹出 它does独立运行时弹出 进一步测试后 我发现所有 TSave TOpen 对话框都不起作用 不工作意味着 Execute 返回Fa
  • 有没有办法让图像通过 ASP.NET 和 app_offline.htm 显示?

    当使用ASP NET的app offline htm功能时 它只允许html 但不允许图像 有没有办法让图像显示无需将他们指向另一个网站上的不同网址 是的 它只是不能来自具有 app offline htm 文件的网站 该图像必须托管在其他
  • 如何向 Symfony/Monolog 日志输出添加附加信息(主机、URL 等)?

    我正在开发我的第一个基于 Symfony 的 WebApp 项目 我已将 Symfony 配置为不仅将日志消息写入不同的日志文件 而且还立即以电子邮件形式发送关键错误消息 这很好用 不过 我想在默认日志消息中添加一些附加信息 以便更轻松地找
  • 是否可以在从模板扩展的天蓝色管道 yml 中使用变量?

    我们正在使用扩展功能以安全的方式重用管道中的模板 为了更轻松地定义模板的参数 我想使用变量 但我觉得这是不可能的 但由于我在官方文档中找不到答案 所以我在这一轮中询问 我的 yml 文件如下所示 name Date yyyyMMdd Rev
  • 在 OSmnx 中将街道划分为更小的路段

    是否可以在 OSmnx 中将街道段划分为更小的部分 例如 假设我们要将一条街道划分为 10 米的路段或将一条街道划分为 10 个相等的部分 G ox graph from place Piedmont California USA netw
  • 通过 VPN 连接到 Flask 应用程序

    我是 Flask 新手 如果问题听起来微不足道 请不要介意 我有一个 Flask 应用程序 不是我编写的 当我直接连接到网络时 它可以在本地计算机和远程计算机上正常工作 但是当我通过 VPN 连接到该应用程序时 它不起作用 我可以在那台机器
  • 如何更改 Ember 中的查询参数?

    我正在编写一个动作处理程序route application actions changeFoo foo I want to change the fooId queryParam to foo get id 问题是我能找到的唯一记录的更改
  • 如何杀死Postgresql中的空闲连接?

    我正在使用 java servlet 和 pgadmin 9 1 问题是 servlet 中的连接未正确关闭 因此如果达到最大连接 它会导致空白屏幕 我不希望每个用户都扩展 pgadmin 中的最大连接 i在 servlet 的起始点和结束
  • 多重继承的机制与构建灵活设计的模板相比

    这是一个更窄的版本question https stackoverflow com questions 32549573 understanding the exposition of alexandrescu about the weak