c++ - 为什么 union 不能用于继承?

标签 c++

我在 C++ 标准 (§9.5/1) 中看到了以下内容:

A union shall not have base classes. A union shall not be used as a base class.

A union can have member functions (including constructors and destructors), but not virtual (10.3) functions

从上面来看,union 也可以有构造函数和析构函数。

那么为什么继承中不允许这样呢?

编辑:用于回答评论:

  1. 如果允许将 union 作为基类,则派生类可以使用其数据。如果派生类只想使用 union 体的一个成员,则可以使用这种方式来节省内存。我认为,这是不正当的继承。在这种情况下,在派生类中使用 union 是否更好?

  2. 如果允许 union 作为派生类,则它可以使用基类的服务。例如,如果 Union 有多种类型的数据。众所周知,只能使用一种类型的数据。对于每种类型的数据,都存在一个基类来为该特定类型提供服务。这种情况下,可以利用多重继承来获取Union中所有类型数据的所有基类的服务。我也觉得这对继承的使用不当。但是在这一点上有没有等效的概念来实现内容呢?

只是我的想法...

最佳答案

这是一个简单的解决方法:

struct InheritedUnion
{
    union {
        type1 member1;
        type2 member2;
    };
};

struct InheritsUnion : InheritedUnion
{};

通过使 union 匿名,它的工作方式就像基类型实际上是一个 union 一样。

关于c++ - 为什么 union 不能用于继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615001/

相关文章:

c++ - 使用模板编译时计算使用 const 值初始化数组

c++ - 手动指定发送数据的网络接口(interface)

c++ - OpenGL 鼠标跟踪(自由线)

c++ - 如何从 TBitmap 获取像素数组?

c++ - 为什么在 C++ 中,我不需要取消引用指向数组的指针来访问数组中的项

c++ - GCC __attribute__((constructor)) 在对象构造函数之前被调用

c++ - 计算累积直方图

c++ - 如何为 Borland 编译器重写 C++ 模板代码

c++ - 解析字符串(带空格)但忽略(Spirit)末尾的空格

c++ - 可以在 Windows 中使用 clang-cl 标志 -fprofile-instr-generate -fcoverage-mapping