Как сделать PHP ловушку?

Поскольку объект 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. Например, он может включать сдвиг адреса, если задействовано несколько наследований.

13
задан alecwhardy 3 December 2011 в 09:58
поделиться