从没有默认构造函数的虚拟基派生类

2023-11-29

我正在为我正在开发的 C++ 应用程序编写一个小的异常类层次结构,并且我无法间接派生std::runtime_error。这是与我迄今为止编写的代码类似的代码:

class RuntimeException : public virtual boost::exception, public virtual std::runtime_error {
public:
    virtual ~RuntimeException() {}
    RuntimeException() : runtime_error("A RuntimeException occurred.") {}
    RuntimeException(const std::string& what) : runtime_error(what) {}
};

class IllegalArgumentException : public virtual RuntimeException {
public:
    IllegalArgumentException() : RuntimeException("An IllegalArgumentException occurred.") {}
    IllegalArgumentException(const std::string& what) : RuntimeException(what) {}
};

The RuntimeException类编译没有问题,但是IllegalArgumentException拒绝在 VS2015 上编译,生成错误:no default constructor exists for class "std::runtime_error"对于两个构造函数IllegalArgumentException。这挑战了我对 C++ 继承层次结构的理解,因为我期望这段代码能够正常编译。

我的理解是IllegalArgumentException should编译是因为,尽管确实如此std::runtime_error没有默认构造函数,它的构造函数被构造函数调用RuntimeException。但显然这一定是错误的,因为编译器拒绝它。似乎要我打电话给std::runtime_error直接从构造函数IllegalArgumentException构造函数(当我这样做时,编译器错误就会消失),但这似乎是错误的,因为那样我会调用构造函数std::runtime_error两次:在构造函数中一次RuntimeException,并再次在构造函数中IllegalArgumentException.

这样做安全和/或有效吗?如果不是,为什么编译器似乎鼓励它?我could只是源自std::exception并实施std::string我自己作为成员变量,但我认为从已经实现了这一点的标准类派生会更容易。这是错误的做法吗?此外,事实上我实际上是从两者中衍生出来的boost:exception and std::runtime_error对此问题有何贡献?


使用时virtual继承的构造函数调用virtual基地的责任是最衍生的类而不是任何中间类的责任。原因很明显:使用virtual继承表明期望实际上有多个派生类使用基类。这些派生类中哪一个将负责构造virtual base?

因此,任何派生类的构造函数都需要向virtual基础,例如:

IllegalArgumentException::IllegalArgumentException(std::string const& what)
    : std::runtime_error(what)
    , RuntimeException(what) {
}

为了避免中间基调用构造函数virtual基类用于virtual继承通常提供默认构造函数。当然,这可能会导致最派生类错误地依赖于其基类之一调用正确的构造函数。

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

从没有默认构造函数的虚拟基派生类 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 如何使用 Paramiko 等 Python 库通过 Telnet 和 SSH 进行链式连接

    类似于这里提出的问题 使用 python SSH 和 telnet 到本地主机 我正在尝试找到以下问题的解决方案 从服务器A 完全权限 通过Jumhost B 无sudo 我想使用Python连接到多个网络设备 一个接一个就足够了 不必在同
  • Asp.net Mvc区域路由问题

    我希望网站的默认页面为 Login cshtml 我得到异常 错误 未找到视图 登录 或其主视图 或者没有视图引擎支持搜索的位置 搜索了以下位置 我有2个区域 结构如下图所示 我的路由配置如下所示 using System using Sy
  • ARM中如何做除法?

    我正在尝试找到如何在 ARM 中进行除法 因为没有DIV命令 如果可以通过浮点数相乘来完成 9 0 09 通过减法或通过使用库 任何方式都可以 目前我正在使用像这样的循环使用减法进行除法 但我丢失了小数 MOV R0 70 Fahrenhe
  • Google 地图中的自定义标记和航点标记

    我正在寻求帮助 我有下面的谷歌地图代码 工作正常 我唯一需要的是起点上的自定义标记 51 943382 6 463116 并且航路点上没有标记 这可以做到吗 我已经尝试了 Stackoverflow 的几种解决方案 但我对 GM 代码和编程
  • 输入类型=文件和 Spring Boot 的 Angular 2 模板表单

    我有一个包含两个输入的表单 一种是文本类型 另一种是文件类型 我怎样才能将文件传递到后端Spring Boot 以及如何使用 postgresql 数据库存储或获取内容数据 预先感谢您的退货 HTML 文件
  • 使用 VBA 宏选择和复制 Outlook 电子邮件正文

    我是 Excel 中 VBA 宏的初学者 这是 Outlook 中的第一次尝试 但这是我正在尝试做的事情 在 Outlook 2010 中 将宏分配给按钮 按下该按钮时 获取活动电子邮件的整个正文 将正文 包括所有格式和 html 复制到剪
  • 为什么 shell 中 0 为 true,1 为 false?

    false echo 上面会输出1 这与我所知道的所有其他编程语言相矛盾 这其中有什么原因吗 Bash 是一种编程 脚本 语言 但它也是一个 shell 和一个用户界面 如果0是错误 那么程序只能出现一种错误 然而在 Bash 中 任何非零
  • 在数组过滤时响应更新,但在添加元素时不响应更新

    我正在尝试模拟一个能够添加和删除产品的表 但是该组件仅在删除组件时更新 但在添加新行时不会更新 我在用着useState 这是我的数组 const rowss createData 1 Zapatillas 2 200 createData
  • 正确地在图像上绘图

    我正在创建一个小型图像编辑器 现在我试图让用户有机会通过拖动鼠标在图像上绘图 就像 MS Paint 中的铅笔工具一样 我遇到了一些困难 因为当我移动光标太快时 应用程序无法绘制所有应该着色的像素 只有一小部分数字被正确着色 我尝试了两种解
  • 使用 jQuery Ajax 删除 mySQL 表行

    我正在尝试做到这一点 因此当我单击跨度图标时 它会将article id发送到我的php sql页面 该页面会删除我的文章 我使用jQuery Ajax发送id id在jQuery端发送正常 但之后http post 请求已完成 我的表行仍
  • 输入对于数组来说太大

    我有一个小问题 我只是想知道 include
  • Azure Web 应用程序从 AAD 身份验证注销

    我无法从以 Azure Active Directory 作为身份验证提供程序的简单 Azure Web 应用程序注销 用户使用显示的 AAD 登录页面登录站点here 但我正在努力找出如何注销用户 我尝试使用各种未记录的注销网址 例如 h
  • Visual Studio 不将 SVG 图像显示为背景

    我有一个带有 html 文件 Html 5 的 asp net 项目 我正在尝试使用 CSS 3 将 SVG 设置为我的 body 标签的背景 我的文件如下 在我的 Style css 中 当我双击并打开 html 文件时 我可以看到主体充
  • 如何编写一个捕获所有异常的“try”/“ except”块?

    我怎样才能写一个try except捕获所有异常的块 除了光秃秃的except 子句 正如其他人所说你不应该使用 你可以简单地抓住Exception import traceback import logging try whatever
  • 实现引用类型和非引用类型的特征会导致实现冲突

    我正在尝试创建一种特征 并为所有非引用类型提供一种实现 为所有引用类型提供另一种实现 这无法编译 trait Foo impl
  • 我应该如何在 ACL 中构建资源树?

    我想使用 PHP 和 Zend ACL 创建一个极其灵活的权限系统 我希望能够向特定类型的所有对象以及这些对象的实例分配权限 如果查询对象的特定实例并且资源树中不存在该实例 则可以使用 通用 对象的权限集 我的问题是 这需要嵌套 并且我无法
  • Internet Explorer z 索引错误?

    如何将一个元素重叠到 Internet Explorer 中相对定位的另一个元素上 Z index 不起作用 它总是出现在相对定位元素的后面 看起来我在开玩笑 但我不是 myLinkCssClass background url
  • Linux x86_64 上的 Cassandra 启动错误 1.2.6

    尝试从最新的稳定版本在 Linux 上安装 cassandra http cassandra apache org download 1 2 6 我已修改 cassndra yaml 以指向自定义目录而不是 var 因为我没有 var 的写
  • 构建 android studio 项目时运行 lint

    我希望在使用 android studio 构建项目时能够运行 lint 任务 以确保遵循 lint 规则 我尝试过使用任务依赖项 但没有成功 我的 TeamCity 构建服务器使用运行 lint 任务的构建任务 因此效果很好 然而 and
  • 从没有默认构造函数的虚拟基派生类

    我正在为我正在开发的 C 应用程序编写一个小的异常类层次结构 并且我无法间接派生std runtime error 这是与我迄今为止编写的代码类似的代码 class RuntimeException public virtual boost