强制所有类在多级继承层次结构中实现/重写“纯虚拟”方法

2024-01-07

在C++中为什么pure virtual方法强制其强制覆盖only到它的直接子级(用于对象创建),但不到孙子级等等?

struct B {
  virtual void foo () = 0;
};
struct D : B {
  virtual void foo () { ... };
};

struct DD : D {
  // ok! ... if 'B::foo' is not overridden; it will use 'D::foo' implicitly
};

我认为忽略此功能没有什么大不了的。
例如,从语言设计的角度来看,有可能:struct DD被允许使用D::foo仅当它有一些明确的声明时,例如using D::foo;。否则它必须覆盖foo强制性的。

在 C++ 中是否有任何实用的方法可以达到这种效果?


我发现了一种机制,至少会提示我们宣布重写的方法明确地。但这不是完美的方式。

假设,我们有几个纯粹的virtual基础中的方法class B:

class B {
  virtual void foo () = 0;
  virtual void bar (int) = 0;
};

其中,假设我们只想要foo()被整个层次结构覆盖。为了简单起见,我们必须有一个virtual基类,其中包含该特定方法。它有一个模板构造函数,它只接受与该方法相同的类型。

class Register_foo {
  virtual void foo () = 0; // declare here
  template<typename T>  // this matches the signature of 'foo'
  Register_foo (void (T::*)()) {}
};
class B : public virtual Register_foo {  // <---- virtual inheritance
  virtual void bar (int) = 0;
  Base () : Register_foo(&Base::foo) {}  // <--- explicitly pass the function name
};

层次结构中的每个后续子类都必须register a foo在其内部每个构造函数 明确地. e.g.:

struct D : B {
  D () : Register_foo(&D::foo) {}
  virtual void foo () {};
};

这种注册机制与业务逻辑无关。虽然,孩子class可以选择使用自己的注册foo或其父母的foo甚至一些类似的语法方法,但至少是这样宣布明确地。

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

强制所有类在多级继承层次结构中实现/重写“纯虚拟”方法 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • Symfony 2 中的中间路由可选参数

    需要解决的问题 在 Symfony 2 中是否可以用 定义路由中间的 可选参数 我将使用其他问题数据 https stackoverflow com questions 17059843 routing in symfony2 option
  • ASP.NET MVC:动作过滤器设置控制器变量?

    我有一个场景 对于每个页面请求 我都必须检查会话是否存在特定 ID 如果发现这一点 我必须从数据库中获取相关对象并将其提供给控制器 如果找不到会话 ID 我需要重定向用户 会话已过期 目前 我有一个自定义代码块 几行 它在控制器内的每个操作
  • 防止在插件中创建

    我在服务活动的预创建上注册了一个插件 在插件中 我检查一些条件 如果满足这些条件 我想停止创建服务活动 我想创建另外两个服务活动来代替该服务活动 但我不希望用户收到这一切的通知 有没有办法停止在 CRM 2011 上的插件中创建 SA 记录
  • 如何将 UUID 转换为 base64?

    我想打字UUID并将其输出到Base64编码格式 但是考虑到输入方法Base64并输出UUID如何实现这一点似乎并不明显 update虽然对于我的用例来说不是明确的要求 但最好知道所使用的方法是否使用 UUID 的原始 UUID UUID
  • 使用相同的 docker 映像部署多个 Cloud Run 服务

    有超过 25 个 Cloudrun 服务使用相同的 docker 镜像 来自 GCR 但配置了不同的变量 有什么简单可靠的方法可以使用来自任何类型传入事件的最新容器映像来部署所有服务 目前使用下面的CLI命令来手动执行一一执行 有没有一种自
  • java子类的私有final字段可以在超级构造函数完成之前初始化吗?

    我有一对像这样的课程 public abstract class Class1 public Class1 function2 protected abstract void function2 public class Class2 im
  • mkstemp 的 java 等效项

    Java中有什么方法可以安全地写入临时文件吗 据我所知 创建临时文件 createTempFile 的唯一方法实际上并不同时打开它 因此文件打开和文件写入之间存在竞争条件 我错过了什么吗 我在 UnixFileSystem java 中找不
  • Vaadin 中当前 UI 的访问方法

    我目前正在 Vaadin 开发 Java Web 应用程序 我想从另一个类访问位于我的 LoginUI 中的 getter 方法 UI getCurrent 成功返回当前线程 LoginUI 我需要调用哪些方法来实现此目的 先感谢您 UI
  • 错误:写入失败、打开流失败、pecl 在 mac osx el Capitan 上安装 oauth

    我正在尝试使用 pecl install 在本地安装 OAuth 版本 1 2 3 在 Mac OSX El Capitan 上运行 PHP 5 6 10 在命令提示符中运行以下命令 sudo pecl install oauth 1 2
  • 如何检测 Racket Web 应用程序上的按键?

    我已经浏览了网络服务器的文档 但找不到任何内容 这是我的基本 Web 应用程序的代码 lang racket require web server servlet web server servlet env define test def
  • Mysql - 可视化 Web 开发人员 - 实体框架

    我遇到以下问题 我有 Visual Web Developer 2010 Express 我正在尝试让它与实体框架和 MySQL 数据库一起使用 我安装了 NET Connector for MySql 但它似乎没有与 Web Develo
  • 页面内容显示在侧边栏下方

    我正在创建一个带有侧边栏的 html 布局 但我的标题和内容出现了下我的侧边栏而不是旁边的 container position relative padding 10px top 0px right 0 left 0 height 120
  • 如何使用依赖于变量的模式执行 Javascript 匹配?

    目前的实施Remy Sharp 的 jQuery 标签建议插件 http remysharp com 2007 12 28 jquery tag suggestion 只检查标签开头的匹配项 例如 输入 Photoshop 将不会返回名为
  • CocoaAsyncSocket 的读写委托不触发&代码组织

    我正在尝试使用 cocoaasyncsocket 库附带的 echo 服务器示例的修改版本执行以下操作 1 打开与充当服务器的 python 脚本的连接2 发送数据 有效 但委托不触发3 接收返回数据 委托不会触发4 断开连接 没有断开连接
  • .NET 4 上的 WCF 流式文件传输

    我需要一个关于 WCF 流式文件传输的好例子 我找到了几个并尝试了它们 但是这些帖子很旧 而且我正在 net 4 和 IIS 7 上工作 所以存在一些问题 你能给我一个很好的 最新的例子吗 以下答案详细介绍了使用一些技术将二进制数据发布到静
  • 与后端同步集合更改

    我使用 Backbone js 并且有一组模型 该集合被检索并显示在前端 在前端 我希望用户删除新模型并将其添加到集合中 当用户完成并单击 保存 时 我希望更新整个集合 这意味着当单击 保存 时 集合会同步 以某种方式 添加的模型将被保存
  • Windows 10 中 NVM 的访问被拒绝问题

    当我在 Windows 10 中使用 nvm v 命令时 我收到 访问被拒绝 的消息 我在这里遇到了类似的问题NVM 被拒绝访问 https stackoverflow com questions 48762782 nvm is acces
  • 在 Elixir 单元测试中导入测试代码

    我正在编写一些与 SSH 交互的 Elixir 代码的测试 在我的测试中 我想启动一个可以运行代码的 SSH 服务器 我更愿意将此代码存储在测试目录中它自己的文件中 并通过各种不同的测试导入它 但我还没能让这个工作得很好 我尝试过创建一个t
  • C# 替换文件中的字符串

    替换 HTML 文件内容的一部分时 String Replace 似乎无法正常工作 例如 String Replace 替换 with blah blah blah html gt 请注意 第二个 HTML 结束标记未正确关闭 因此当用户在
  • 强制所有类在多级继承层次结构中实现/重写“纯虚拟”方法

    在C 中为什么pure virtual方法强制其强制覆盖only到它的直接子级 用于对象创建 但不到孙子级等等 struct B virtual void foo 0 struct D B virtual void foo struct D