2009-08-10 11 views

Respuesta

29

Usa dynamic_cast al convertir desde un tipo de clase base a un tipo de clase derivada. Comprueba que el objeto que se está emitiendo es en realidad del tipo de clase derivada y devuelve un puntero nulo si el objeto no es del tipo deseado (a menos que esté convirtiendo a un tipo de referencia, entonces arroja una excepción bad_cast).

Utilice static_cast si esta comprobación adicional no es necesaria. Como dijo Arkaitz, dado que dynamic_cast realiza la comprobación adicional, requiere información RTTI y, por lo tanto, tiene una sobrecarga de tiempo de ejecución mayor, mientras que static_cast se realiza en tiempo de compilación.

+2

los moldes dinámicos también se pueden usar para el moldeo de referencias, en cuyo caso arrojan una excepción en el error de fundición, en lugar de devolver un punto nulo –

+0

dynamic_cast incluso puede arrojar una excepción en el tiempo de ejecución. –

+0

@Neil, Martin: gracias, he editado mi respuesta. –

2

El reparto dinámico requiere RTTI y tiene algo de magia en comparación con el lanzamiento estático. static_cast es solo un lanzamiento en tiempo de compilación, comprueba si la clase de origen puede promocionarse a la clase convertida mediante algunas reglas simples como herencia.

Por ejemplo, en los casos de herencia virtual, solo dynamic_cast puede resolver la situación.

Aparte, dynamic_cast devolverá NULL si el lanzamiento 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 que aumenta el tamaño de los binarios.

+0

dynamic_cast incluso puede arrojar una excepción en el tiempo de ejecución. –

0

Si está hablando de C++. Entonces static_cast no es un tipo de casting seguro. Puede transmitir a su tipo, pero si está mal no arrojará ningún error/mensaje. Entonces obtendrás un objeto malo de eso. Y el dynamic_cast está lanzando un error si el casting falló :) ¡Espero que esto ayude! :)

3

dynamic_cast verifica la información disponible en el tiempo de ejecución, como RTTI, también atraviesa las jerarquías de clases para ver si dicho molde es posible.

Comprobar C++ type casting tutorial at cplusplus.com

2

static_cast es similar a la antigua fundición de estilo C y se puede aplicar a casi cualquier cosa. static_cast se usaría cuando usted tenga ciertos tipos en cuestión. Por ejemplo, usualmente uso un static_cast cuando lanzo entre int y enum.

dynamic_cast solo se puede utilizar con punteros y referencias. En caso de falla al lanzar, se devuelve un puntero nulo. dynamic_cast se usa generalmente al resolver punteros a clases usadas en herencia donde desea asegurarse de que el puntero que está lanzando es del tipo esperado.

También puedes ver C++ : Documentation : C++ Language Tutorial : Type Casting

+2

lo que dicen de static_cast en realidad sería más correcto de reinterpret_cast –

+0

Estoy de acuerdo con anon, reintepret_cast es similar al elenco de estilo C. – Aminos

2

fundición estática se realiza por el compilador: se trata el resultado como el tipo de destino, no importa qué. Haga esto cuando esté absolutamente seguro de que el argumento es del tipo de destino.

La fundición dinámica se realiza en tiempo de ejecución y, por lo tanto, requiere información del tipo de tiempo de ejecución.Hace esto cuando no está seguro del tipo que tiene: el lanzamiento puede fallar, lo que se muestra cuando el valor de retorno es nulo. También se puede hacer solo para punteros y referencias.

7

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 comprobación en tiempo de compilación, use static_cast (limitado a lo que sabe el compilador). Para la comprobación en tiempo de ejecución, use dynamic_cast (limitado a clases con RTTI). Para no verificar, use reinterpret_cast.

Cuestiones relacionadas