c++ - tipos - lanzamiento estático versus lanzamiento dinámico
tiro de entrada en baloncesto (7)
El compilador realiza la conversión estática: trata el resultado como el tipo de destino, sin importar qué. Haga esto cuando esté absolutamente seguro de que el argumento es del tipo de destino.
La conversión dinámica se realiza en tiempo de ejecución y, por lo tanto, requiere información de tipo de tiempo de ejecución. Haga esto cuando no esté seguro del tipo que tiene: la conversión puede fallar, lo que se muestra cuando el valor de retorno es nulo. También se puede hacer solo para punteros y referencias.
Posible duplicado:
Reparto regular vs. static_cast vs. dynamic_cast
No acabo de saber cuándo usar el reparto estático y cuándo dinámico. ¿Alguna explicación por favor?
El lanzamiento dinámico requiere RTTI y hace algo de magia en comparación con el lanzamiento estático. static_cast es solo un tiempo de compilación, verifica si la clase de origen puede ser promovida a la clase lanzada por algunas reglas simples como herencia.
Por ejemplo, en casos de herencia virtual, solo dynamic_cast puede resolver la situación.
Además, dynamic_cast devolverá NULL si la conversión no es posible, por lo que puede tomar una decisión diferente.
Por otro lado, dynamic_cast es más lento, ya que implica que se está ejecutando algún código y, como se dijo anteriormente, necesita RTTI habilitado, lo que aumenta el tamaño de los binarios.
En algunos contextos, como este, "estático" se refiere a tiempo de compilación y "dinámico" se refiere a tiempo de ejecución.
Para la verificación en tiempo de compilación, use static_cast (limitado a lo que sabe el compilador). Para la verificación en tiempo de ejecución, use dynamic_cast (limitado a las clases con RTTI). Para ninguna comprobación, utilice reinterpret_cast.
Si estás hablando de C ++. Entonces static_cast no es un tipo de casting seguro. Se puede convertir a su tipo, pero si está mal, no arrojará ningún error / mensaje. Así obtendrás mal objeto de eso. Y el dynamic_cast está lanzando un error si el lanzamiento fallado :) ¡Espero que esto ayude! :)
dynamic_cast comprueba la información disponible en tiempo de ejecución, como RTTI, también atraviesa jerarquías de clase para ver si tal conversión es posible.
static_cast
es similar al antiguo estilo C y se puede aplicar a casi cualquier cosa. static_cast
se usaría cuando esté seguro de los tipos en cuestión. Por ejemplo, por lo general uso un static_cast
cuando se realiza la conversión entre int
y enum
.
dynamic_cast
solo se puede utilizar con punteros y referencias. Si no se lanza, se devuelve un puntero nulo. dynamic_cast
se usa generalmente cuando se resuelven los punteros a las clases usadas en la herencia donde se quiere asegurar que el puntero que está lanzando sea del tipo esperado.
También puedes ver C ++: Documentación: Tutorial de lenguaje C ++: Type Casting
Utilice dynamic_cast
cuando dynamic_cast
conversión de un tipo de clase base a un tipo de clase derivado. Comprueba que el objeto que se está emitiendo es en realidad del tipo de clase derivado y devuelve un puntero nulo si el objeto no es del tipo deseado (a menos que esté bad_cast
conversión a un tipo de referencia, luego arroja una excepción bad_cast
).
Utilice static_cast
si esta comprobación adicional no es necesaria. Como dijo Arkaitz, ya que dynamic_cast
realiza la verificación adicional, requiere información RTTI y, por lo tanto, tiene una mayor sobrecarga de tiempo de ejecución, mientras que static_cast
se realiza en tiempo de compilación.