超类并集上的覆盖子类并集 我想知道是否可以将成员附加到子类中的C++联盟。

超类并集上的覆盖子类并集 我想知道是否可以将成员附加到子类中的C++联盟。,c++,inheritance,unions,C++,Inheritance,Unions,class A { ... union { int a; int b; }; }; class B : public A { ... int c; //<- Can this use the same storage as the union? }; A类{ ... 并集{inta;intb;}; }; B类:公共A{ ... int c;//你说过 我想知道是否可以将成员附加到子类中的C++联盟。 该语言不允许扩展联合。无法将成员附加到联合

class A { 
    ...
    union { int a; int b; };
 };

 class B : public A {
     ...
     int c; //<- Can this use the same storage as the union?
 };
A类{
...
并集{inta;intb;};
};
B类:公共A{
...
int c;//你说过

我想知道是否可以将成员附加到子类中的C++联盟。

该语言不允许扩展
联合
。无法将成员附加到
联合


更糟糕的是,与
class
es和
struct
s不同,后者可以通过创建子类(structs)来扩展,
union
s不能有基类。它们也不能用作基类。

首先,根据标准9.5第1点,在一个union中,最多一个非静态数据成员可以在任何时间处于活动状态,也就是说,最多一个非静态数据成员的值可以在任何时间存储在一个union中

在您的例子中,由于c是一个int,向原始联合添加成员没有任何好处。只需重用现有的int中的一个。或者从一开始就在联合中预见所有可能的标记成员

但是,您可以将c定义为引用,并将其指定为联合成员的地址,记住联合对象的所有非静态数据成员都具有相同的地址(§9.5/1):

B类:公共A类{

int&c;//事实是,你为什么要这样做?我的一个朋友也让我相信,这几乎肯定会在优化下崩溃。
class B : public A {
    int& c; //<- Can this use the same storage as the union?
public: 
    B() : c(A::a) {}
    void test() {
        a = 10;
        std::cout << "a=" << a << "; ";
        std::cout << "c=" << c << "; ";
        c = 20;
        std::cout << "a=" << a << "; ";
        std::cout << "c=" << c << "; ";
    }
};