纯虚函数可能没有内联定义。为什么?

2024-05-09

纯虚函数是那些虚函数并且具有纯说明符 ( = 0; )

第 10.4 条第 2 款C++03 的内容告诉我们什么是抽象类,顺便说一句,如下:

[注意:函数声明不能​​同时提供纯说明符和定义 ——尾注] [示例:

struct C {
virtual void f() = 0 { }; // ill-formed
};

—结束示例]

对于那些不太熟悉这个问题的人,请注意纯虚函数可以有定义但上述子句禁止此类定义出现内联(词汇上的类内)。 (对于定义纯虚函数的用途,您可能会看到,例如,这得到了 http://www.gotw.ca/gotw/031.htm)

现在,对于所有其他种类和类型的函数,都可以提供类内定义,并且这种限制乍一看绝对是人为且难以解释的。想想看,第二眼和后来的目光似乎都是如此:)但我相信,如果没有特定的原因,这种限制就不会存在。

我的问题是:有人吗know具体有那些原因呢?Good也欢迎大家猜测。

Notes:

  • MSVC 确实允许 PVF 具有内联定义。所以不要感到惊讶:)
  • 这个单词inline在这个问题中没有提到inline关键词。应该是这个意思词汇上的类内

在SO线程中“为什么纯虚函数初始化为0?” /questions/2156634/why-is-a-pure-virtual-function-initialized-by-0Jerry Coffin 提供了 Bjarne Stroustrup 的这句话C++ 的设计与演变 //www.stroustrup.com/dne.html,第 §13.2.3 节,我在其中添加了一些我认为相关的部分的强调:

好奇的=0选择语法而不是引入新关键字 pure 或 Abstract 的明显替代方案,因为当时我认为没有机会接受新关键字。如果我建议使用 pure,那么 Release 2.0 就不会附带抽象类。如果要在更好的语法和抽象类之间进行选择,我选择了抽象类。我没有冒延迟的风险,也没有因纯粹而引发某些争论,而是使用了传统的 C 和 C++ 约定,即使用 0 来表示“不存在”。这=0语法适合我认为函数体是函数的初始化器以及作为函数指针向量实现的虚拟函数集的(简单但通常足够)视图。 [……]

因此,在选择语法时,Bjarne 将函数体视为声明器的一种初始化器部分,并且=0作为初始化程序的另一种形式,表示“没有主体”(或者用他的话说,“不在那里”)。

按理说,在那个概念图景中,一个人不可能既表示“不在那里”又拥有一个身体。

或者,仍然在那个概念图中,有两个初始化程序。

现在,这就是我的心灵感应能力、google-foo 和软推理能力。我猜想没有人有足够的兴趣™向委员会提出一项关于取消这种纯粹语法限制的提案,并跟进所需的所有工作。所以现在还是这样。

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

纯虚函数可能没有内联定义。为什么? 的相关文章

  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐