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_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" );     
}

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 virtuelle Methoden gezeigt.

Wie immer gilt: Castings sind vermeidbar und sollten vermieden werden!