2013-04-12 7 views
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; 
}; 

В принципе, я хотел бы иметь класс, содержащий Союз производных классов. Затем я хотел бы реализовать весь базовый класс виртуальных функций с точки зрения моего Союза.

Я могу попытаться перефразировать это, если это слишком запутанно.

Благодаря

+0

У меня был бы удар, перефразируя его. –

+1

Вот для чего нужны указатели :) 'Base * mData' с соответствующими назначениями должен делать трюк. – dasblinkenlight

ответ

0

Технически вы можете, правильность синтаксиса и компилятор позволит вам рассматривать как переменные экземпляра, как и следовало ожидать (с теми же ограничениями, что относится в целом к ​​профсоюзам).

На практике это кажется ненужным, когда есть взаимное исключение, вы можете легко использовать указатель на экземпляр:

CommonAncestor *mData; 

я вижу много проблем ремонтопригодности с использованием конструкций, которые должны были быть использован, когда полиморфизм Didn На этом языке существует.

+0

Да, это имеет смысл. Теперь я чувствую себя глупо, не думая просто использовать такой указатель. Благодарю. – Slater

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; 

Но это серьезно некрасиво.

+0

Это определенно делает трюк, и я согласен, что это уродливо. Спасибо за вашу помощь. – Slater