Transmisión_dinámica

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 24 de julio de 2013; las comprobaciones requieren 19 ediciones .


En el lenguaje de programación C++ , una operación convierte un tipo de datos (puntero o referencia) en la jerarquía de herencia (de un tipo antepasado a un tipo secundario), verificando si la conversión es válida mediante la identificación dinámica del tipo de datos . Este tipo de conversión se denomina "descendente" porque mueve el puntero hacia abajo en la jerarquía de clases desde la clase base hasta la clase derivada. dynamic_cast

A diferencia de la conversión de tipo de estilo C normal , la validación de la conversión de tipo se realiza en tiempo de ejecución . El operador dynamic_castse puede aplicar a punteros o referencias . El objetivo principal dynamic_castes convertir un puntero que contiene la dirección de un objeto principal en un puntero del tipo de un objeto secundario. Si la conversión no es posible (los tipos no están relacionados), se obtendrá un puntero nulo . Cuando se trabaja con referencias , si la conversión de tipo no es posible, se lanzará una excepción std::bad_cast . Por lo tanto, el operador dynamic_castexhibe una similitud en el procedimiento de conversión de tipos para un lenguaje de programación como Java , en contraste con C , que no verifica la exactitud de la conversión de tipos en tiempo de ejecución.

Ejemplo

Supongamos que una función toma un objeto de tipo Acomo argumento y necesita realizar algún trabajo adicional si el objeto pasado a la función es en realidad un objeto de tipo que Bhereda de la clase A. Este comportamiento se puede lograr cuando se usa dynamic_castde la siguiente manera.

Alicaído:

#include <typeinfo> // Para std::bad_cast #include <iostream> // Para std::cerr, etc. clase A { público : // El mecanismo de identificación de tipos de datos dinámicos solo está disponible para clases polimórficas // (es decir, clases que contienen al menos una función de miembro virtual) virtual void foo (); // otros miembros de la clase... }; clase B : público A { público : método voidSpecificToB ( ); // otros miembros de la clase... }; anular mi_función ( A & my_a ) { probar { B & my_b = transmisión_dinámica < B &> ( my_a ); mi_b . métodoEspecificoToB (); } captura ( const std :: bad_cast & e ) { estándar :: cerr << e . qué () << std :: endl ; std :: cerr << "Este objeto no es un objeto de tipo B" << std :: endl ; } }

my_functionSe puede escribir un código similar para una función utilizando punteros en lugar de referencias :

void mi_funcion ( A * my_a ) { B * mi_b = transmisión_dinámica < B *> ( mi_a ); si ( mi_b ) my_b -> methodSpecificToB (); más std :: cerr << "Este objeto no es un objeto de tipo B" << std :: endl ; }

Posibles falacias lógicas

Los errores son posibles si la conversión no tuvo lugar (la operación devolvió NULL o se lanzó una excepción bad_cast), y el programa no está preparado para esto.

Véase también

Enlaces