Безопасное преобразование типов (type casting) в C++ обеспечивается с помощью операторов приведения: static_cast, dynamic_cast, const_cast, reinterpret_cast.
nullptr для указателей или кинет исключение для ссылок.Когда использовать:
dynamic_cast с виртуальными базами. Для конвертации между простыми/совместимыми типами — static_cast.Пример:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Безопасное преобразование в нижестоящий класс Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Вопрос: Можно ли привести объект базового класса к производному с помощью static_cast, если объект на самом деле не является экземпляром производного класса?
Ответ: Да, static_cast компилируется, но поведение будет неопределенным, если объект не реально является объектом производного класса. Только dynamic_cast гарантирует безопасность такого приведения. Применение static_cast для downcast допустимо только если уверены в реальном типе объекта.
История
В крупной embedded-системе касты между родительским и дочерним классом делались через static_cast. В некоторых случаях это приводило к краху при попытке обращения к несуществующим полям — программа пыталась интерпретировать память другого типа.
История
При разработке плагинной архитектуры программисты использовали reinterpret_cast для приведения указателей между разными типами, что приводило к чтению мусора и вылетам на моменте исполнения, особенно при попытках динамического преобразования через DLL.
История
В общем корпоративном фреймворке забывали про виртуальные деструкторы в базовом классе, что делало невозможным корректную работу dynamic_cast и приводило к memory leak и corruption при удалении объекта через указатель на базовый класс.