În limbajul de programare C++ , o operație convertește un tip de date (pointer sau referință) în jos în ierarhia moștenirii (de la un tip strămoș la un tip copil), verificând dacă castarea este validă utilizând identificarea dinamică a tipului de date . Acest tip de conversie este numit „downcast” deoarece mută indicatorul în jos în ierarhia clasei de la clasa de bază la clasa derivată.
dynamic_cast
Spre deosebire de turnarea normală de tip C -style , validarea tipului de turnare se face în timpul rulării . Operatorul dynamic_castpoate fi aplicat la pointeri sau referințe . Scopul principal dynamic_casteste de a converti un pointer care conține adresa unui obiect părinte într-un pointer de tipul unui obiect copil. Dacă conversia nu este posibilă (tipurile nu sunt legate), se va obține un pointer nul . Când lucrați cu referințe , dacă conversia tipului nu este posibilă, va fi lansată o excepție std::bad_cast . Astfel, operatorul dynamic_castprezintă o asemănare în procedura de conversie a tipului cu un limbaj de programare precum Java , spre deosebire de C , care nu verifică corectitudinea conversiei tipului în timpul execuției.
Să presupunem că o funcție ia un obiect de tip Aca argument și trebuie să efectueze o muncă suplimentară dacă obiectul transmis funcției este de fapt un obiect de tip care Bmoștenește din clasă A. Acest comportament poate fi realizat atunci când este utilizat dynamic_castîn felul următor.
Doborât:
#include <typeinfo> // Pentru std::bad_cast #include <iostream> // Pentru std::cerr etc. clasa A { public : // Mecanismul de identificare a tipurilor de date dinamice este disponibil numai pentru clasele // polimorfe (adică clase care conțin cel puțin o funcție membru virtual) virtual void foo (); // alți membri ai clasei... }; clasa B : public A { public : void methodSpecificToB (); // alți membri ai clasei... }; void my_function ( A și my_a ) { încerca { B & my_b = dynamic_cast < B &> ( my_a ); my_b . methodSpecificToB (); } catch ( const std :: bad_cast & e ) { std :: cerr << e . ce () << std :: endl ; std :: cerr << "Acest obiect nu este un obiect de tip B" << std :: endl ; } }Cod similar pentru o funcție my_functionpoate fi scris folosind pointeri în loc de referințe :
void my_function ( A * my_a ) { B * my_b = dynamic_cast < B *> ( my_a ); dacă ( my_b ) my_b -> methodSpecificToB (); altfel std :: cerr << "Acest obiect nu este un obiect de tip B" << std :: endl ; }Erorile sunt posibile dacă conversia nu a avut loc (operația a returnat NULL sau a fost aruncată o excepție bad_cast), iar programul nu este pregătit pentru aceasta.