Dynamic_cast

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2013. július 24-én áttekintett verziótól ; az ellenőrzések 19 szerkesztést igényelnek .


A C++ programozási nyelvben egy művelet átalakít egy adattípust (mutatót vagy hivatkozást) lefelé az öröklődési hierarchiában (az őstípustól a gyermektípusig), és dinamikus adattípus-azonosítással ellenőrzi, hogy az öntvény érvényes -e. Ezt a fajta átalakítást "downcast"-nak nevezik, mivel az osztályhierarchiában lefelé mozgatja a mutatót az alaposztályról a származtatott osztályba. dynamic_cast

A normál C -stílusú típusú öntéssel ellentétben a típusöntés ellenőrzése futási időben történik . Az operátor mutatókra vagy hivatkozásokradynamic_cast alkalmazható . A fő cél az, hogy egy szülőobjektum címét tartalmazó mutatót egy utódobjektum típusú mutatóvá alakítson át. Ha az átalakítás nem lehetséges (a típusok nem kapcsolódnak egymáshoz), null mutatót kapunk . Ha referenciákkal dolgozik , ha a típuskonverzió nem lehetséges, a rendszer egy std::bad_cast kivételt dob ​​fel. Így az operátor hasonlóságot mutat a típuskonverziós eljárásban egy programozási nyelvhez, például a Java -hoz, ellentétben a C -vel, amely nem ellenőrzi a típuskonverzió helyességét futás közben. dynamic_castdynamic_cast

Példa

Tegyük fel, hogy egy függvény egy típusú objektumot vesz Aargumentumként, és némi extra munkát kell végeznie, ha a függvénynek átadott objektum valójában egy típusú objektum, amely Baz osztályból örökli A. Ezt a viselkedést a következő módon lehet elérni dynamic_cast.

Lehangolt:

#include <typeinfo> // Std::bad_cast esetén #include <iostream> // For std::cerr stb. A osztály { nyilvános : // A dinamikus adattípus azonosítási mechanizmus csak polimorf osztályokhoz // (vagyis legalább egy virtuális tagfüggvényt tartalmazó osztályokhoz) érhető el virtual void foo (); // más osztálytagok... }; B osztály : nyilvános A { nyilvános : void methodSpecificToB (); // más osztálytagok... }; érvénytelen my_function ( A & my_a ) { próbálja meg { B & my_b = dinamikus_cast < B &> ( my_a ); my_b . methodSpecificToB (); } catch ( const std :: bad_cast & e ) { std :: cerr << e . mit () << std :: endl ; std :: cerr << "Ez az objektum nem B típusú objektum" << std :: endl ; } }

Egy függvényhez hasonló kód my_functionírható hivatkozások helyett mutatókkal :

érvénytelen my_function ( A * my_a ) { B * my_b = dinamikus_cast < B *> ( my_a ); ha ( my_b ) my_b -> methodSpecificToB (); más std :: cerr << "Ez az objektum nem B típusú objektum" << std :: endl ; }

Lehetséges logikai hibák

Hibák előfordulhatnak, ha az átalakítás nem történt meg (a művelet NULL értéket adott vissza, vagy bad_cast kivételt dobott), és a program nem áll készen erre.

Lásd még

Linkek