В C и C ++ обычно неопределенное поведение (читается как «незаконно, но разрешено компилятором») для разыменования объекта одного типа через указатель или ссылку на объект другого типа (с несколькими исключениями, такими как доступ через указатель на базовый класс).Это называется правилом строгого алиасинга.
Подробнее здесь: Что такое правило строгого алиасинга?
Ваш код нарушает это правило, получая доступобъект типа A через указатель на тип B.
Обратите внимание, что обычно компилятор не может проверить ваши статические приведенные значения (в вашем случае C-приведение эквивалентно static_cast
).Если вы не уверены в типе объекта, dynamic_cast
, чтобы проверить, является ли приведение допустимым во время выполнения, в отличие от static_cast
, который проверяется только во время компиляции и допускает некоторые неправильные приведения.