C++ 工会行为

C++ 工会行为,c++,class,unions,C++,Class,Unions,有可能从联合中获得以下行为吗 class A : public Base //Base is an abstract base class. { public: A( int ); virtual void foo() //A virtual function from Base. { //I don't want to have to specify if it's oneOption or twoOption. // I would lik

有可能从联合中获得以下行为吗

class A : public Base //Base is an abstract base class.
{
  public:
    A( int );
    virtual void foo() //A virtual function from Base.
    {
      //I don't want to have to specify if it's oneOption or twoOption.
      // I would like it to just call whichever one's is defined in mData.
      mData.foo();
    }
  private:
    union B
    {
      C oneOption; //A class which inherits from Base.
      D twoOption; //Another class which inherits from Base.
    } mData;
};
基本上,我希望有一个包含派生类并集的类。然后,我想用我的Union实现所有虚拟函数基类

如果这太令人困惑,我可以试着重新措辞


从技术上讲,感谢您,语法是正确的,编译器将允许您按照预期处理这两个实例变量(使用通常适用于联合的相同约束)

实际上,当存在互斥时,这似乎是不必要的,您可以轻松地使用指向实例的指针:

CommonAncestor *mData;

通过使用在语言中不存在多态性时使用的结构,我可以看到许多可维护性问题。

从技术上讲,语法是正确的,编译器将允许您按照预期处理这两个实例变量(使用通常适用于联合的相同约束)

实际上,当存在互斥时,这似乎是不必要的,您可以轻松地使用指向实例的指针:

CommonAncestor *mData;

通过使用在语言中不存在多态性时使用的构造,我可以看到许多可维护性问题。

联盟成员不允许有构造函数

您可以这样做:

void PickC() { new (oneOption) C; }
void PickD() { new (twoOption) D; }
C * GetC() { return (C*) oneOption; }
D * GetD() { return (D*) twoOption; }

private:

union B
{
  char oneOption[ sizeof(C) ]; //A class which inherits from Base.
  char twoOption[ sizeof(D) ]; //Another class which inherits from Base.
} mData;

但是它非常丑陋。

工会成员不允许有构造函数

您可以这样做:

void PickC() { new (oneOption) C; }
void PickD() { new (twoOption) D; }
C * GetC() { return (C*) oneOption; }
D * GetD() { return (D*) twoOption; }

private:

union B
{
  char oneOption[ sizeof(C) ]; //A class which inherits from Base.
  char twoOption[ sizeof(D) ]; //Another class which inherits from Base.
} mData;

但是它真的很难看。

我会尝试重新表述它。这就是指针的作用:)
Base*mData
有正确的赋值应该会起作用。我会尝试重新表述它。这就是指针的作用:)
Base*mData
有正确的赋值应该起作用。是的,这很有道理。现在我觉得自己很傻,因为我不想用那样的指针。谢谢。是的,这很有道理。现在我觉得自己很傻,因为我不想用那样的指针。谢谢。这绝对是个好办法,我同意这很难看。谢谢你的帮助。这确实奏效了,我同意这很难看。谢谢你的帮助。