typeid-Operator

Syntax

typeid(type-id)
typeid(expression)

Hinweise

Der typeid-Operator ermöglicht, den Typ eines Objekts zur Laufzeit zu bestimmen.

Das Ergebnis von typeid ist ein const type_info&. Der Wert ist ein Verweis auf ein type_info-Objekt, das entweder die Typ-ID oder den Typ des Ausdrucks darstellt, je nachdem, welche Form von typeid verwendet wird. Weitere Informationen finden Sie unter type_info-Klasse.

Der typeid-Operator funktioniert nicht mit verwalteten Typen (abstrakte Deklaratoren oder Instanzen). Informationen zum Abrufen des Type eines angegebenen Typs finden Sie unter typeid.

Der typeid-Operator führt eine Laufzeitüberprüfung durch, wenn er auf einen l-Wert eines polymorphen Klassentyps angewendet wird, bei dem der Objekttyp nicht anhand der statischen Informationen bestimmt werden kann. Zu solchen Fällen zählen folgende:

  • Ein Verweis auf eine Klasse

  • Ein Zeiger, der durch * dereferenziert wird

  • Ein indizierter Zeiger ([ ]). (Es ist nicht sicher, einen Index mit einem Zeiger auf einen polymorphen Typ anzuwenden.)

Wenn der Ausdruck auf einen Basisklassentyp verweist, aber das Objekt tatsächlich von einem Typ ist, der von dieser Basisklasse abgeleitet ist, enthält das Ergebnis einen type_info-Verweis auf die abgeleitete Klasse. Der Ausdruck muss auf einen polymorphen Typ zeigen (eine Klasse mit virtuellen Funktionen). Andernfalls ist das Ergebnis die type_info für die statische Klasse, auf die im Ausdruck verwiesen wird. Überdies muss der Zeiger dereferenziert werden, damit das verwendete Objekt dasjenige ist, auf das er zeigt. Ohne Dereferenzierung des Zeigers ist das Ergebnis die type_info für den Zeiger, jedoch nicht dessen Ziel. Beispiel:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

Wenn der Ausdruck einen Zeiger dereferenziert und der Wert dieses Zeigers null ist, löst typeid eine bad_typeid-Ausnahme aus. Wenn der Zeiger nicht auf ein gültiges Objekt zeigt, wird eine __non_rtti_object-Ausnahme ausgelöst. Sie weist auf einen Versuch hin, die RTTI zu analysieren, die einen Fehler ausgelöst hat, weil das Objekt in irgendeiner Weise ungültig ist. (Es handelt sich z. B. um einen ungültigen Zeiger, oder der Code wurde nicht mit /GR kompiliert).

Wenn der Ausdruck kein Zeiger und kein Verweis auf eine Basisklasse des Objekts ist, ist das Ergebnis ein type_info-Verweis, der den statischen Typ des Ausdrucks darstellt. Der Teil static type eines Ausdrucks bezeichnet den Ausdruckstyp, der zur Kompilierungszeit bekannt ist. Die Ausführungssemantik wird ignoriert, wenn der statische Typ eines Ausdrucks bewertet wird. Außerdem werden wenn möglich Verweise ignoriert, wenn der statische Typ eines Ausdrucks bestimmt wird:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid kann auch in Vorlagen verwendet werden, um den Typ eines Vorlagenparameters zu bestimmen:

// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}

Siehe auch

Laufzeit-Typinformationen
Schlüsselwörter