La conversión de tipos segura (type casting) en C++ se realiza mediante los operadores de conversión: static_cast, dynamic_cast, const_cast, reinterpret_cast.
nullptr para punteros o lanzará una excepción para referencias.Cuándo usar:
dynamic_cast con bases virtuales. Para la conversión entre tipos simples/compatibles, use static_cast.Ejemplo:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Conversión segura a la clase derivada Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Pregunta: ¿Se puede convertir un objeto de la clase base a derivada usando static_cast, si el objeto no es realmente una instancia de la clase derivada?
Respuesta: Sí, static_cast se compila, pero el comportamiento será indefinido si el objeto no es realmente un objeto de la clase derivada. Solo dynamic_cast garantiza la seguridad de tal conversión. El uso de static_cast para downcast es aceptable solo si se está seguro del tipo real del objeto.
Historia
En un gran sistema embebido, los casts entre la clase padre y la clase hija se hacían a través de static_cast. En algunos casos, esto llevó a caídas al intentar acceder a campos inexistentes, ya que el programa intentaba interpretar la memoria de otro tipo.
Historia
Al desarrollar una arquitectura de plugins, los programadores usaban reinterpret_cast para convertir punteros entre diferentes tipos, lo que conducía a lecturas de basura y fallos en tiempo de ejecución, especialmente al intentar conversiones dinámicas a través de DLL.
Historia
En un marco corporativo general, olvidaron sobre los destructores virtuales en la clase base, lo que hacía imposible el funcionamiento correcto de dynamic_cast y conducía a fugas de memoria y corrupción al eliminar un objeto a través de un puntero a la clase base.