Поскольку объект Derived*
не является объектом Base*
, и вполне возможно, что у двух могут быть разные макеты памяти или представления значений (если требования выравнивания Base
и Derived
отличаются, например). Поскольку один из них не является другим, static_cast
бессилен выполнять преобразование.
Если вы знаете, что делаете, и знаете, что тип каламбур в порядке, используйте инструмент для типа punning & mdash; reinterpret_cast
:
reinterpret_cast<Base*&>(derived);
И помните о любых последствиях неправильного использования (как всегда идет reinterpret_cast
). Обратите внимание, в частности, что на C ++ 11 3.10 / 10 любой доступ через результат приведения будет неопределенным поведением в отношении стандарта (хотя ваш компилятор может дать более надежные гарантии).
Обратите внимание, что в общем случае приведение от Derived*
до Base*
не обязательно должно быть no-op. Например, он может включать сдвиг адреса, если задействовано несколько наследований.