50 likes | 176 Vues
Konvertering supertyp subtyp. Konvertering från supertyp till subtyp görs med dynamic_cast För att komma åt medlem som bara finns i subtypen. Är det dålig design att ha sådana medlemmar?. dynamic_cast med pekare. Behövs t.ex. för att anropa medlemsfunktion som inte finns i “överklassen”:
E N D
Konvertering supertyp subtyp • Konvertering från supertyp till subtyp görs med dynamic_cast • För att komma åt medlem som bara finns i subtypen. • Är det dålig design att ha sådana medlemmar? CD5250 OOP med C++ Mats Medin MDH/IDT
dynamic_cast med pekare Behövs t.ex. för att anropa medlemsfunktion som inte finns i “överklassen”: Drawable *mittRitobjekt = hamtaNastaObj; Pil *pp = dynamic_cast<Pil*>(mittRitobjekt); if (pp) // Det var en pil, konvertering lyckades! pp->byt_riktning(); Objektets dynamiska typ är känd men för medlemsåtkomst används den statiska typen. :-( CD5250 OOP med C++ Mats Medin MDH/IDT
dynamic_cast med referens Exempel: anropa subtypens medlemsfunktioner på ett objekt utpekat av “supertypreferens”: Drawable &mittRitobjekt = hamtaNastaObj; try { Pil &pp = dynamic_cast<Pil&>(mittRitobjekt); pp->byt_riktning(); } catch (std::bad_cast) { /* Det var inte en pil */} CD5250 OOP med C++ Mats Medin MDH/IDT
typeid och type_info För avlusning, anses fult att använda i färdiga program #include <typeinfo> type_info ti; class Minklass : public Overklass {…} Minklass mittobj; Overklass *minpekare = & mittobj; ti = typeid(*myptr); cout << ti.name() << endl; // Vad händer? CD5250 OOP med C++ Mats Medin MDH/IDT
typeid och type_info forts cout << ti << endl; // Vad händer? klass med virtuella funktioner: • det av myptr utpekade objektets dynamiska typ skrivs ut, dvs Minklass klass utan virtuella funktioner: • den statiska typen hos uttrycket (*myptr) skrivs ut, dvs Basklass typeid funkar på alla slags typer och uttryck: typeinfo(myint), typeinfo(a || b), typeinfo(3.1415) CD5250 OOP med C++ Mats Medin MDH/IDT