是否可以从联盟中获得以下行为?
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的类。然后我想根据我的联盟实现所有虚函数基类。
如果它太混乱,我可以试着改写一下。
由于
答案 0 :(得分: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;
但它非常难看。
答案 1 :(得分:0)
从技术上讲,你可以,语法是正确的,编译器会让你按照你的预期处理两个实例变量(通常适用于联合的相同约束)。
在实践中,当存在互斥时,您可以轻松使用指向实例的指针:
CommonAncestor *mData;
通过使用在语言中不存在多态性时要使用的构造,我可以看到许多可维护性问题。