====== sicheres Casten - dynamic_cast ====== 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|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 [[cpp:oop:start|objektorientiert]] arbeitet, damit eine Virtual Table besitzt, also mindestens den [[cpp:oop:destruct|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" ); } ===== Der bessere Stil ===== 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 [[cpp:oop:virtual|virtuelle Methoden]] gezeigt. Wie immer gilt: Castings sind vermeidbar und sollten vermieden werden!