Ein dynamic_cast
wird wie folgt aufgebaut
dynamic_cast< neuerTyp >( object )
Zurückgegeben wird ein Objekt im gewünschten Typ neuerTyp
.
dynamic_cast
dient nur einem Zweck und zwar dem Casten von Referenzen oder Zeigern auf Objekten in andere Referenzen bzw. Zeiger auf einen anderen Objekttyp. Es ist dabei aber aber nicht garantiert, dass ein gültiges Objekt zurückgegeben wird, das Ergebnis kann auch NULL sein, wenn ein Cast nicht möglich ist.
Diese Überprüfung findet zur Laufzeit statt, was zum einen bedeutet, dass die Überprüfung im Gegensatz zum static_cast
Zeit kostet und zum anderen zur Laufzeit die Information über den Datentyp noch vorhanden sein muss. Das geht nur dann, wenn der umzuformende Datentyp objektorientiert arbeitet, damit eine Virtual Table besitzt, also mindestens den virtuellen Destruktor.
class Tier { virtual ~Tier() {}; }; class Hund : public Tier {}; class Katze : public Tier {}; class Auto {}; int main () { Hund hund(); Tier * pTier = &hund; Hund * pHund = dynamic_cast< Hund * >( pTier ); // ergibt Zeiger auf hund Katze * pKatze = dynamic_cast< Katze * >( pTier ); // ergibt NULL Auto * pAuto = dynamic_cast< Auto * >( pTier ); // ergibt NULL Tier & rTier = hund; Hund & rHund = dynamic_cast< Hund & >( rTier ); // ergibt Referenz auf hund Katze & pKatze = dynamic_cast< Katze & >( rTier ); // ergibt Referenz auf hund Auto & pAuto = dynamic_cast< Auto & >( rTier ); // ergibt Exception std::bad_cast return 0; }
dynamic_cast
verwendet man entsprechend dann, wenn man ein Basis-Objekt hat und prüfen möchte, ob es einem bestimmten Objekttyp entspricht:
void gibLaut( Tier & tier ) { if( dynamic_cast< Hund * >( &tier ) ) printf( "Wau!\n" ); else if( dynamic_cast< Katze * >( &tier ) ) printf( "Miau!\n" ); else printf( "unverständliches Geräuch\n" ); }
Wie immer sind Castings der Weg einen Fehler im Design zu kaschieren. Der bessere Weg ist die Funktion gibLaut()
als zugehörig zum Tier zu machen und jedem Tier eine eigene Implementation zu geben. Wie dies aussieht, ist für dieses Beispiel im Kapitel virtuelle Methoden gezeigt.
Wie immer gilt: Castings sind vermeidbar und sollten vermieden werden!