En C++ los casts específicos son formas más controladas de realizar conversiones entre tipos. Estos son static_cast, dynamic_cast, const_cast y reinterpret_cast.
Cada uno tiene su propósito específico
static_cast: Para conversiones entre tipos relacionados sin polimorfismodynamic_cast: Para conversiones seguras en jerarquías de clases polimórficasconst_cast: Para eliminar o añadirconst(con precaución ⚠️)reinterpret_cast: Conversiones de bajo nivel entre tipos no relacionados, como punteros y enteros (con mucha precaución ❗)
Estos permiten gestionar de manera más segura la conversión de tipos, frente al operador “clásico” de conversión (tipoDato)objeto (sobre todo al trabajar con jerarquías de clases y herencia).
Aunque el operador (tipoDato) es más rápido de escribir, puede ser peligroso porque no realiza ningún tipo de verificación de seguridad, lo que puede resultar en error.
Conversión con static_cast
static_cast se usa para conversiones entre tipos relacionados que pueden ser determinadas en tiempo de compilación. Este tipo de cast es muy útil para convertir entre tipos numéricos, así como en jerarquías de clases sin polimorfismo.
No se debe usar static_cast cuando hay polimorfismo involucrado, ya que no comprueba si la conversión es segura en tiempo de ejecución. En su lugar, debes utilizar dynamic_cast en estos casos.
Conversión con dynamic_cast
dynamic_cast se utiliza principalmente cuando trabajamos con jerarquías de clases que tienen al menos una función virtual (es decir, clases con polimorfismo).
Este tipo de cast es el único que verifica la validez de la conversión en tiempo de ejecución, devolviendo nullptr si la conversión no es posible.
- Usa
dynamic_castcuando trabajas con clases que tienen polimorfismo y necesitas verificar en tiempo de ejecución si una conversión es válida.
- No uses
dynamic_castsi puedes determinar la conversión en tiempo de compilación (usastatic_casten esos casos).
Conversión con const_cast
const_cast se utiliza para eliminar o añadir el calificador const a un objeto.
Aunque parece útil, modificar un objeto que fue declarado originalmente como const puede resultar en comportamiento indefinido, así que se debe usar con precaución.
- Úsalo solo cuando trabajes con funciones mal diseñadas o APIs que no manejan correctamente el calificador
const.
- Evita modificar objetos que fueron originalmente declarados como
const - Es más, en general evita usarlo 😉
Conversión con reinterpret_cast
reinterpret_cast es el cast más peligroso y se utiliza para realizar conversiones de bajo nivel entre tipos de punteros o entre punteros y tipos de datos enteros.
A diferencia de los otros tipos de cast, no realiza ningún tipo de verificación de seguridad y simplemente “reinterpretará” los bits del objeto en el nuevo tipo.
Básicamente, reinterpret_cast es similar al cast clásico (tipoDato).
- Úsalo solo cuando trabajes con sistemas de bajo nivel (como controladores de hardware o APIs que requieren este tipo de conversiones).
- Evita usarlo para cualquier tipo de conversión entre clases o tipos de datos que no estén directamente relacionados
- Es más, evita mucho usarlo
