run time type information (RTTI)

Zusätzlich zu der ,,alten`` Möglichkeit in C, eine Typkonversion (cast) durchzuführen, indem man den gewünschten Typ in Klammern vor einen Ausdruck schreibt, kommen jetzt weitere Varianten hinzu, die wesentlich sicherer zu verwenden sind.

Ein Problem mit der alten cast-Version besteht darin, daß häufig unklar ist, was wirklich passiert.

Beispiele:

Der alte cast bewirkt also je nach Umständen manchmal wirklich eine sinnvolle Konversion, manchmal dagegen nur ein Neuinterpretieren eines Bitmusters, im obigen Beispiel einer Adresse. Gerade beim Interpretieren eines Zeigers hat man kaum Kontrolle, ob der cast Sinn macht.

Um die Absicht des Programmierers klarer auszudrücken, sollte der bisherige cast nur noch möglichst wenig verwendet werden. Stattdessen bieten sich die folgenden neuen Operatoren an:

Weiterhin gehört zur Gruppe der RTTI-Operatoren noch typeid(). Damit kann zur Laufzeit der Typ eines Ausdrucks oder eines Typnamens in Erfahrung gebracht werden. Ähnlich wie sizeof() kann typeid() mit einem Typ oder einem Ausdruck aufgerufen werden. Geliefert wird ein Objekt vom Typ type_info (deklariert in <typeinfo>), das allerdings nicht gespeichert werden kann (weil der Konstruktor private deklariert ist).

Man kann aber zwei Objekte davon vergleichen, sowie mit der Methode name() einen String liefern lassen, der eine textuelle Beschreibung des Typs liefert (der Text ist aber systemabhängig).

Wenn typeid() für einen NULL-Zeiger aufgerufen wird, wird eine Ausnahme vom Typ bad_typeid geworfen (Ausnahmen der Standardbibliothek).

Beispiel:

#include <iostream>
#include <typeinfo>

using namespace std;

class A
{
};

int main( int nargs, char **args )
{
  A a;
  cout << ( typeid( A )==typeid( a ) ? "gleich" : "nicht gleich" )
       << endl;
  cout << " Name = " << typeid( A ).name() << endl;

  return 0;
}

AnyWare@Wachtler.de