【问题标题】:In C++, why do virtual functions disqualify class type as aggregate? [duplicate]在 C++ 中,为什么虚函数会取消类类型作为聚合的资格? [复制]
【发布时间】:2020-08-04 03:42:25
【问题描述】:

在 11.6.1 中它说:

聚合是 [snip] 一个类

  • 没有虚函数
  • [剪辑]

这是为什么呢?为什么我们不希望聚合具有虚函数?设计原理是什么?

【问题讨论】:

  • 似乎是一个历史性的决定。参考this answer的cmets。

标签: c++ c++17 c++20


【解决方案1】:

聚合类是一个与 C 结构非常相似的概念。它们可以使用相同的初始化器列表语法进行初始化。如果您有虚函数,则需要额外的初始化来初始化支持虚函数所需的内部变量。

现在我们可以有带有初始化列表的类,但在 C++11 之前,使用初始化列表初始化它们的能力是一个主要区别。

这种差异对于某些 C 模式特别有用。考虑 Pthread 的PTHREAD_MUTEX_INITIALIZER。它是一个宏,它以这样一种方式初始化 Pthreads 互斥锁,即第一次尝试正确使用它会完成互斥锁初始化。这种模式在 C 中是微不足道的,并且希望它也能在 C++ 中工作。

非常非正式地说,聚合和 POD 类(现在是标准布局)是“所见即所得”的类。它们与 C 中的工作方式非常相似,允许大量的互操作性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多