Udostępnij za pośrednictwem


typeid — operator

typeid( type-id ) 
typeid( expression )

Uwagi

Operator typeid pozwala, aby typ obiektu był ustalony w czasie wykonywania.

Wynik typeid jest consttype_info&.Wartość jest odwołaniem do obiektu type_info, który reprezentuje type-id lub typ expression, w zależności od formy użycia typeid.Zobacz type_info Class, aby uzyskać wiecej informacji.

Operator typeid nie działa z typami zarządzanymi (abstrakcyjnymi deklaratorami lub wystąpieniami), zobacz TypeID, aby uzyskać informacje na temat uzyskiwania Type określonego typu.

Operator typeid wykonuje sprawdzanie w czasie wykonania po zastosowaniu l-wartości do typu polimorficznej klasy, gdzie prawidłowego typu obiektu nie można określić dostarczonymi statycznymi informacjami.Takie przypadki są:

  • Odwołaniem do klasy

  • Wskaźnikiem, usunięciem odwołania z *

  • Indeksem wskaźnika (tj.) [ ]). (Należy zauważyć, że ogólnie nie jest bezpieczne użycie indeksu dolnego z wskaźnikiem do typu polimorficznego).

Jeśli expression wskazuje na typ klasy bazowej, obiekt jest faktycznie typu pochodzącego z tej klasy bazowej, odwołanie type_info do klasy pochodnej jest wynikiem.expression musi wskazywać typ polimorficzny (klasa funkcji wirtualnych).W przeciwnym razie wynikiem jest type_info dla klasy statycznej określonej w expression.Ponadto wskaźnik musi usunąć odwołania, aby wskazywany przez nią obiekt był używany.Bez dereferencji wskaźnika, wynik będzie type_info dla wskaźnika, a nie tym, na co wskazuje.Na przykład:

// 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;
}

Jeśli expression jest usunięciem odwołania do wskaźnika, i że jego wartość wynosi zero, typeid wyrzuca wyjątek bad_typeid.Jeżeli wskaźnik nie wskazuje prawidłowego obiektu, wyjątek __non_rtti_object jest zgłoszony wskazując próbę analizowania RTTI, który wywołał błąd (jak naruszenie zasad dostępu), ponieważ obiekt jest z jakiegoś powodu nieprawidłowy (zły wskaźnik lub kod nie został skompilowany z /GR).

Jeśli expression nie jest ani wskaźnikiem ani odwołaniem do klasy bazowej obiektu, wynik jest odwołaniem type_info odpowiadającym typowi statycznego expression.Wyrażenie static type odwołuje się do typu wyrażenia jaki jest znany w czasie kompilacji.Semantyka wykonania jest ignorowana przy ocenie typu statycznego wyrażenia.Ponadto odwołania są ignorowane, gdy to możliwe przy określaniu typu statycznego wyrażenia:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeid można również w szablonach w celu określenia typu parametru szablonu:

// 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 );
}

Zobacz też

Informacje

Informacje o typie uzyskiwanym w czasie rzeczywistym

Słowa kluczowe języka C++