typeid Operator
typeid( type-id )
typeid( expression )
Hinweise
Der Operator typeid können den Typ eines Objekts zur Laufzeit bestimmt werden soll.
Das Ergebnis typeid ist const type_information&.Der Wert ist ein Verweis auf ein type_information-Objekt, das entweder die TYPE ID oder den Typ des Ausdrucksdarstellt typeid abhängig vom Formular aus.Weitere Informationen finden Sie unter type_information Klasse .
Der Operator typeid funktioniert nicht mit verwalteten Typen (abstrakte Deklaratoren oder Instanzen) finden typeid Informationen über das Abrufen Type eines angegebenen Typs.
Der typeid-Operator führt eine Laufzeitüberprüfung, falls er zu einem l-Wert einer polymorphen Klassentyps angewendet wird, in dem der tatsächliche Typ des Objekts nicht durch die statischen bereitgestellten wurden Informationen bestimmt werden kann.Für solche Fälle sind:
Ein Verweis auf eine Klasse
Ein Zeiger dereferenziert mit *
Ein indizierter Zeiger (d. h.[ ]).(Beachten Sie, dass es im Allgemeinen nicht sicher ist, einen Index mit einem Zeiger auf einen polymorphen Typ zu verwenden.)
Wenn der Ausdruck zu einem Typ der Basisklasse verweist, jedoch das Objekt tatsächlich von einem Typ ist, der von dieser Basisklasse abgeleitet ist, ist ein type_information Verweis auf die abgeleitete Klasse das Ergebnis.Der Ausdruck muss zu einer polymorphen Typ (eine Klasse mit virtuellen Funktionen veranschaulicht werden.)Andernfalls ist das Ergebnis type_information für die statische Klasse, die im Ausdruckverwiesen wird.Darüber hinaus muss der Zeiger dereferenziert werden, sodass das Objekt, das er verweist, verwendet wird.Um ohne den Zeiger zu dereferenzieren, ist das Ergebnis type_information für den Zeiger, nicht den zeigt.Beispiele:
// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo.h>
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 Zeigerwert null ist, löst typeidbad_typeid Ausnahmeaus.Wenn der Zeiger nicht auf ein gültiges Objekt wird, wird eine Ausnahme ausgelöst __non_rtti_object und gibt einen Versuch auf, das RTTI zu analysieren, das einen Fehler (z) - Zugriffsverletzung ausgelöst wurde, weil das Objekt gültig ist (ein ungültiger Zeiger oder der Code kompiliert wurden nicht mit /GR).
Wenn der Ausdruck weder ein Zeiger noch ein Verweis auf eine Basisklasse Objekt ist, ist das Ergebnis ein type_information Verweis, der den statischen Typ des Ausdrucksdarstellt.Der statische Typ eines Ausdrucks bezeichnet den Typ eines Ausdrucks an, wie es zur Kompilierungszeit bekannt ist.Semantik der Ausführung wird ignoriert, wenn der statische Typ eines Ausdrucks ergibt.Außerdem werden Verweise ignoriert, wenn möglich, 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 in den Vorlagen kann auch 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 );
}