Рассмотрим объединение, члены которого имеют общий базовый класс:
struct Base {
int common;
};
struct DerivedA : Base {};
struct DerivedB : Base {};
union Union {
DerivedA a;
DerivedB b;
};
Независимо от того, что союз "содержит" во время выполнения (т.е. какое последнее сохраненное значение было), до тех пор, пока оно содержит что-то, что-то является подклассом Base
. Есть ли способ законно использовать эту идею для доступа к полю Base
, не зная фактического типа объекта, хранящегося в объединении?
Может быть что-то вроде:
Base* p = reinterpret_cast<Base*>(&u);
... возможно, нет. Возможно это:
Base* p2 = static_cast<Base *>(&u.a);
Является ли это законным, если u.b
было последним сохраненным значением?
Я знаю, что существуют специальные правила о "общих начальных последовательностях", которые применяются к объединениям, но неясно, есть ли что-то подобное для базовых классов.
Очевидно, что это не будет работать для множественного наследования, поэтому, возможно, это указание, что оно не будет работать вообще.