2014-09-04 10 views
7

Mi chiedo se sia possibile aggiungere membri a un unione C++ in una sottoclasse.Overlay unione sottoclasse ontop dell'unione superclasse

class A { 
    ... 
    union { int a; int b; }; 
}; 

class B : public A { 
    ... 
    int c; //<- Can this use the same storage as the union? 
}; 

Un esempio più concreto sarebbe l'idea di un'unione tag, in cui si desidera avere una sottoclasse che aggiunge un tipo al sindacato.

+0

Il fatto è, perché lo faresti? – Nelfeal

risposta

3

Lei ha detto,

Mi chiedo se è possibile accodare ai membri di un sindacato C++ in una sottoclasse.

La lingua non consente di estendere un union. L'aggiunta di membri a union non è possibile.

Quel che è peggio, a differenza class es e struct s, che può essere estesa attraverso la creazione di sotto-classi (struct), union s non possono avere classi di base. Non possono neanche essere usati come classi base.

2

Primo, secondo lo standard, 9,5 punto 1, in un unione, al massimo uno dei dati non statici i membri possono essere attivi in ​​qualsiasi momento, ovvero il valore di al massimo uno dei non statici i membri dei dati possono essere archiviati in un sindacato in qualsiasi momento.

Nel tuo caso, come c è un int, non vi è alcun vantaggio di aggiungere un membro al sindacato originale. Basta riutilizzare uno degli esistenti. O prevedere nell'unione tutti i possibili membri del tag fin dall'inizio.

cosa si potrebbe fare comunque, è quello di definire c come riferimento, e assegnare l'indirizzo di un membro del sindacato, tenendo presente che Tutti i membri di dati non statici di un oggetto unione hanno lo stesso indirizzo (§ 9.5/1):

class B : public A { 
    int& c; //<- Can this use the same storage as the union? 
public: 
    B() : c(A::a) {} 
    void test() { 
     a = 10; 
     std::cout << "a=" << a << "; "; 
     std::cout << "c=" << c << "; "; 
     c = 20; 
     std::cout << "a=" << a << "; "; 
     std::cout << "c=" << c << "; "; 
    } 
}; 

La constraitn di un membro di unione attiva signe rimane naturalmente in vigore.

A proposito, perché non è possibile condividere la stessa unione tra classe base e classe derivata? Poiché la norma dice:

  • A meno ridichiarato nella classe derivata, i membri di una classe base vengono anche considerati membri della classe derivata (§ 10 punto 2)

  • dati non statico i membri di una classe (non-union) con lo stesso controllo di accesso sono allocati in modo che i membri successivi abbiano indirizzi superiori all'interno di un oggetto classe. (§ 9.2 pt 13)

  • Quindi i membri della classe derivata hanno un indirizzo superiore rispetto ai membri della classe base.

  • Ma Tutti i membri di dati non statici di un oggetto unione hanno lo stesso indirizzo (§ 9,5/1)

  • Perciò non è possibile che i membri della classe derivata appartengono ad un'unione nel classe base. QED.

+0

Un mio amico mi ha anche convinto che anche questo si sarebbe quasi certamente rotto sotto ottimizzazione. –

Problemi correlati