C++ 聚合没有虚函数吗?

2023-11-22

在 C++ 中,聚合是(取自语言规范的 8.5.1p1)

一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有私有或 受保护的非静态数据成员(第 11 条),无基类(第 10 条),并且无虚函数(10.3)。

So, #1不是一个聚合,但是#2是一个聚合体。为什么是#1也不是一个聚合体?

struct A { virtual void bark() { } int a; }; // #1
struct B { A b; }; // #2

为什么#1 也不是聚合?

因为聚合的标准定义表明事实并非如此。该定义表明,如果类被视为聚合类型,则该类不能具有虚函数。就是这样。这就是“显而易见的队长”的答案。

既然您引用了标准定义(并且阅读了它,我猜),您已经知道这一点,所以我必须假设您要问的是是否存在任何根本原因为什么具有虚函数的类不能成为聚合类型。

显然,具有虚函数的类必须将其虚表指针(或其他机制)初始化为编译器生成的构造函数的一部分。聚合真正提供的唯一功能(除了充当 POD 等的基本定义之外)是对其数据成员进行大括号初始化的能力。我看不出编译器在初始化虚拟表指针时不能简单地允许大括号初始化语法的任何原因。

据,直到...为止B就而言,它可以是一个聚合,因为只要有一种方法可以从初始化列表中提供(或未提供)的任何内容构造数据成员,即它需要每个数据成员具有一些(编译器生成的或不是编译器生成的)默认、复制或移动构造函数。请记住,聚合的定义是shallow相对于递归的就像 POD 定义(简单,std-layout)一样,这意味着只有顶级类有这些限制,而其子对象则没有。

聚合的定义显然很容易让人想起 C 结构体的限制,而结构体的大括号初始化显然也是从 C 继承下来的一个特性。我相信,由于历史原因,聚合体的定义是这样构建的,它反映了 C 结构体,而不是因为编译器可以做什么或不能做什么。

我当然认为没有充分的理由限制聚合不具有虚拟函数。也许应该向标准委员会提出建议以取消此限制(因为它不会破坏任何现有代码)。特别是现在,使用统一的初始化语法,聚合只不过是类,编译器可以在其中生成一个以所有数据成员作为参数的构造函数(默认值是默认构造的对象)。聚合的唯一其他目的是集中一些适用于 POD 类的限制(琐碎的、标准布局等),对于这些类,不具有虚拟函数的限制是合理的(AFAIK),但这只是一个将该限制转移到 POD 的问题。

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

C++ 聚合没有虚函数吗? 的相关文章

  • 从 C# 调用非托管 dll。拿2

    我编写了一个 C 程序 它调用一个 C DLL 将命令行参数回显到文件中 当使用 rundll32 命令调用 c 时 它显示命令行参数没有问题 但是当从 c 内部调用它时 它不会显示 我问了这个问题 https stackoverflow
  • 即使我没有#include ,为什么仍然可以使用 std::max 和 std::min ?

    include
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 如何查找boost运行时版本

    我正在编写一个使用 boost 的 C 库 在这个库中 我想包含有关用于编译我的库的二进制版本的 boost 版本的信息 我可以使用宏BOOST VERSION这很好 我还想确定哪个是 boost 的运行时版本 以便我可以与用于编译我的库的
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 为什么C#不支持多重继承? [复制]

    这个问题在这里已经有答案了 可能的重复 C 应该包含多重继承吗 https stackoverflow com questions 191691 should c include multiple inheritance 为什么C 不支持多
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐

  • 根据一列对另一列进行排序

    我想根据 B 列的值对 A 列进行排序 在 Google 表格中 这很简单 SORT A1 A100 B1 B100 TRUE 如何做到这一点Excel 要手动执行此操作 您可以突出显示要排序的所有列 然后单击 主页 选项卡中 排序和过滤
  • 在 Matplotlib 极坐标图上设置径向轴

    我正在极坐标图上绘制方位角 仰角曲线 其中仰角是径向分量 默认情况下 Matplotlib 绘制从中心 0 到周边 90 的径向值 我想扭转它 所以 90 度是在中心 我尝试通过调用 ax set ylim 90 0 设置限制 但这会导致抛
  • 如何使用数据关闭来关闭引导面板?

    我有一个打开面板的按钮 我希望能够像使用警报一样关闭它 Bootstrap 文档中的默认面板示例 div class panel panel default div class panel heading Panel heading wit
  • Python dask 数组对象的项分配

    我创建了一个 Python dask 数组 并尝试按如下方式修改数组的一部分 import numpy as np import dask array as da x np random random 20000 100 100 Creat
  • 无法克隆存储库:致命:R 任何 gitolite-admin gitolite 均被 Fallthru 拒绝

    我正在设置gitolite第一次 我正在跟进本说明 当我 ssh 时 看起来很好 ssh p 2222 gitolite debian PTY allocation request failed on channel 0 hello git
  • std::allocator 构造/销毁与放置 new/p->~T()

    对于我的一个项目 我正在从头开始编写一些 STL 容器 我有我的理由 由于我如此密切地模仿 STL 的功能和接口 因此我会尽最大努力遵守 如果它与标准结构同名 它将尽可能符合标准 的政策 因此 当然我的容器将分配器作为模板参数 这非常好 因
  • NGINX“Access-Control-Allow-Origin”标头包含多个值

    我有一个带有 PHP 的 NGINX 服务器 假设主机名为http myserver com 我有一个 PHP 脚本 我正在通过 XHR 从本地主机上的网页访问该脚本 我将它用作类似于 freegeoip net 的 GeoIP 服务器 我
  • 将行从一个表复制到另一个表,忽略重复项

    我有 2 个具有相同架构的表 srcTable1 和 destTable 我试图将所有行从 srcTable 复制到 destTable 并忽略重复项 我想我可以添加一个带有子查询的 WHERE 子句 该子查询只会给我不重复的行 然而 它似
  • android.widget.Button 无法转换为 android.widget.EditText

    在开发我的第一个 Android 计算器应用程序时 我通过意图传递答案 成功更新了新活动中的 TextView 但这需要用户按 返回 来执行另一次计算 我试图让 doCalculation 按钮更新 MainActivity 中的简单 Te
  • unix 套接字上的原子写入?

    我正在尝试选择pipes and Unix 套接字对于IPC机制 两者都支持select and epoll 功能很棒 现在 管道具有 4kB 截至今天 的 原子 写入 这是由 Linux 内核保证的 unix 套接字是否存在这样的功能 我
  • OpenCV 中未记录的 groupRectangles 变体

    在OpenCV中的cascadeDetect cpp中 有以下几种变体groupRectangles功能 void groupRectangles std vector
  • 了解 JavaScript 中的事件队列和调用堆栈

    当我解决这个问题时 我对理解 事件队列 和 调用堆栈 概念的好奇心开始了 var list readHugeList var nextListItem function var item list pop if item process t
  • 构建参数化的 EntityFramework 核心表达式

    你好 我正在尝试构建一个表达式来通过主键获取通用实体并获取参数化的 SQL 查询 目前我可以获得正确的 WHERE 查询 但它没有参数化 public async Task
  • 将侦听器添加到通过 XTemplate 创建的 DOM 的正确技术?

    我们使用 XTemplates 很多 XTemplates 它们非常适合显示只读内容 但是您是否曾向通过模板创建的 DOM 添加 Ext JS 侦听器 您愿意分享您创建这些侦听器的首选技术吗 我首选的技术是使用类似的 live来自 jque
  • 有没有办法从 DataContract 导出 XSD 架构

    我正在使用 DataContractSerializer 将我的类序列化为 XML 或从 XML 反序列化 一切工作正常 但在某些时候我想为这些 XML 文件的格式建立一个独立于实际代码的标准架构 这样 如果序列化过程中出现问题 我可以随时
  • HTML 中所有锚点的一般偏移量?

    我有一些锚元素 但它们位于绝对位置 div 并且 div 的内容太大 以至于它在内部滚动 溢出 自动 div 中的所有条目顶部都有一个锚点 但是如果我转到这个锚点 我想要的元素直接位于侧面的顶部 但我希望它位于中心 我需要像偏移这样的东西
  • Java - 类方法可以看到同类参数的私有字段

    我遇到了一个相当奇怪的行为 不确定这是 Java 问题还是 Eclipse 的问题 采取以下代码 class Foo private String text public void doStuff Foo f System out prin
  • 无法创建 PoolableConnectionFactory(用户 ''@'localhost' 的访问被拒绝

    在过去的几天里 我一直在尝试为网络应用程序设置 DatabaseConnectionPool 但没有成功 我已经阅读了 Tomcat 文档的相关部分以及围绕该主题的大量内容 并认为我做的一切都是正确的 但显然不是因为我不断收到以下错误 Ca
  • 在 Docker 容器中运行时,JVM 无法映射保留内存

    我似乎根本无法在服务器上的 Docker 容器中运行 java 即使在发行时java version 我收到以下错误 root 86088d679103 java version OpenJDK 64 Bit Server VM warni
  • C++ 聚合没有虚函数吗?

    在 C 中 聚合是 取自语言规范的 8 5 1p1 一个数组或一个类 第 9 条 没有用户提供的构造函数 12 1 没有私有或 受保护的非静态数据成员 第 11 条 无基类 第 10 条 并且无虚函数 10 3 So 1不是一个聚合 但是