Tenir compte d'un syndicat dont les membres partagent une classe de base commune:Est-il autorisé à accéder à une classe de base commune des membres du syndicat, quel que soit le type stocké?
struct Base {
int common;
};
struct DerivedA : Base {};
struct DerivedB : Base {};
union Union {
DerivedA a;
DerivedB b;
};
Peu importe ce que l'union « contient » lors de l'exécution (c.-à-ce que la dernière valeur stockée était), tant qu'il contient quelque chose, que quelque chose est la sous-classe Base
. Existe-t-il alors un moyen d'utiliser légalement cette idée pour accéder au champ Base
, sans connaître le type réel de l'objet stocké dans l'union?
Peut-être quelque chose comme:
Base* p = reinterpret_cast<Base*>(&u);
... probablement pas. Peut-être ceci:
Base* p2 = static_cast<Base *>(&u.a);
Est-il légal si u.b
était la dernière valeur stockée?
Je sais qu'il existe des règles spéciales sur les "séquences initiales communes" qui s'appliquent aux unions, mais il n'est pas clair s'il existe quelque chose de similaire pour les classes de base. De toute évidence, cela ne fonctionnera pas pour l'héritage multiple, donc c'est peut-être une indication que cela ne fonctionnera pas du tout.
"Une classe de mise en page standard est une classe qui ... a le même contrôle d'accès (article 11) pour tous les membres de données non statiques ... soit n'a aucun membre de données non statiques dans la classe la plus dérivée et la plupart d'une classe de base avec des membres de données non statiques, ou n'a pas de classes de base avec des membres de données non statiques ... "Comme indiqué dans la question,' DerivedA' et 'DerivedB' sont compatibles avec la disposition. Mais dès que les classes dérivées ont un membre de données non statique, elles ne sont plus compatibles avec la mise en page. Mais les classes de base sont, donc ... pas sûrs. –