C++ 我可以创建类的并集吗

C++ 我可以创建类的并集吗,c++,class,unions,C++,Class,Unions,我有两个通信类,它们永远不会同时存在,但都将被使用 例如: class CommA { public: void SendA(); ... private: ProtocolA a; ... } class CommB { public: void SendB(); ... private: ProtocolB b; ... } 有没有可能让它们结合在一起以节省内存 union CommAB { CommA a;

我有两个通信类,它们永远不会同时存在,但都将被使用

例如:

class CommA
{
public:
    void SendA();
    ...
private:
    ProtocolA a;
    ...
}

class CommB
{
public:
    void SendB();
    ...
private:
    ProtocolB b;
    ...
}
有没有可能让它们结合在一起以节省内存

union CommAB
{
    CommA a;
    CommB b;
}
其他人已经在评论和回答中提出了这个问题。我将解释为什么这是推荐的方法

关于工会有一件重要的事情需要知道:在任何时候,工会中只有一个成员可以活跃。如果您创建了一个
AB
对象,它要么是
a
要么是
b
,如果您访问了错误的对象,它就是UB。你怎么知道哪一个是主动的?幸运的是,该标准提供了一些保证:如果所有联合成员的类都以相同的公共成员开始,那么您可以安全地访问它们。通常的诀窍是在联合的所有类中都有第一个成员,以确定哪个是活跃的成员。另一个问题可能是当您有一个活动成员并希望更改它时

变体
的优点是,它可以处理这些实际方面,而无需担心,也无需调整成员的类


因为你在寻找空间:工会占据了它最大成员的空间。因此,如果您必须在类中添加一个普通的额外成员来跟踪活动的联合成员,那么您的联合将比初始的a或B更大。变体为您提供了工作,因此它也将更大

现代C++中的等价物是肯定的,虽然是首选,你试过了吗?你遇到什么问题了吗?是的,但是你需要一个自定义的构造器和一个联合的析构函数,这很难正确地编写。如果您必须询问,那么您最好使用
std::variant
,它与自定义构造函数、析构函数和一些安全机制完全一样。