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.
Il fatto è, perché lo faresti? – Nelfeal