1

是否有可能从联盟中获得以下行为?

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 来实现所有的虚函数基类。

如果它太令人困惑,我可以尝试重新措辞。

谢谢

4

2 回答 2

2

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

你可以这样做:

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;

但它严重丑陋。

于 2013-04-12T02:17:59.907 回答
-1

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

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

CommonAncestor *mData;

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

于 2013-04-12T02:05:28.400 回答