Reparto regular vs. Reparto_estático vs. Reparto_dinámico
Llevo casi veinte años escribiendo código en C y C++, pero hay un aspecto de estos lenguajes que nunca he entendido bien. Evidentemente, he utilizado los lanzamientos regulares, es decir
MyClass *m = (MyClass *)ptr;
por todas partes, pero parece que hay otros dos tipos de calcos, y no sé la diferencia. ¿Cuál es la diferencia entre las siguientes líneas de código?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
1654
3
Deberías consultar el artículo Programación C++/Configuración de tipos.
Contiene una buena descripción de todos los diferentes tipos de fundición. Lo siguiente está tomado del enlace anterior:
Los moldes de estilo C confunden const_cast, static_cast y reinterpret_cast.
Desearía que C++ no tuviera casts al estilo de C. Los casts de C++ destacan adecuadamente (como deberían; los casts son normalmente indicativos de que se está haciendo algo malo) y distinguen adecuadamente entre los diferentes tipos de conversión que realizan los casts. También permiten que se escriban funciones de aspecto similar, por ejemplo, boost::lexical_cast, lo que es bastante bueno desde la perspectiva de la consistencia.
El operador
dynamic_cast
tiene comprobación de tipo en tiempo de ejecución y sólo funciona con referencias y punteros, mientras questatic_cast
no ofrece comprobación de tipo en tiempo de ejecución. Para obtener información completa, consulte el artículo de MSDN static_cast Operator.