Compartilhar via


Operador typeID

typeid( type-id )
typeid( expression )

Comentários

O typeid operador permite que o tipo de um objeto a ser determinado em tempo de execução.

O resultado de typeid é um consttype_info &. O valor é uma referência a um type_info objeto representando a identificação do tipo ou o tipo da expressão, dependendo de qual forma de typeid é usado.Consulte type_info a classe para obter mais informações.

O typeid operador não funciona com tipos gerenciados (declaradores abstratas ou instâncias), consulte typeID para obter informações sobre como obter o Type de um tipo especificado.

O typeid operador oferece uma verificação de tempo de execução quando aplicado a um l-value de um tipo de classe polimórfica, onde o verdadeiro tipo de objeto não pode ser determinado pelas informações estáticas fornecidas.Nesses casos são:

  • Uma referência a uma classe.

  • Um ponteiro, com a sua referência cancelado *

  • Um ponteiro subscrito (ou seja,[ ]).(Observe que geralmente não é seguro usar um subscrito com um ponteiro para um tipo polimórfico).

Se o expressão aponta para um tipo de classe base, ainda que o objeto é realmente de um tipo derivado dessa classe base, um type_info de referência para a classe derivada é o resultado.O expressão deve apontar para um tipo polimórfico (uma classe com funções virtuais).Caso contrário, o resultado é o type_info para a classe estática referida a expressão.Além disso, o ponteiro deve referência cancelado para que o objeto que ele aponta é usado.Sem cancelar a referência do ponteiro, o resultado será o type_info o ponteiro, não o que ele aponta.Por exemplo:

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

Se o expressão cancelar a referência de um ponteiro, e que o valor do ponteiro é zero, typeid lança um a exceção de bad_typeid.Se o ponteiro não aponta para um objeto válido, um __non_rtti_object exceção é lançada, o que indica uma tentativa de analisar o que disparou uma falha de RTTI (como a violação de acesso), porque o objeto de alguma forma é inválido (ponteiro incorreto ou o código não foi compilado com /GR).

Se o expressão nem um ponteiro como uma referência a uma classe base do objeto, o resultado é um type_info referência representando o tipo estático da expressão.O tipo estático de uma expressão faz a referência ao tipo de uma expressão como é conhecido em tempo de compilação.Semântica de execução é ignorada ao avaliar o tipo estático de uma expressão.Além disso, as referências são ignoradas quando possível, ao determinar o tipo estático de uma expressão:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeID também pode ser usado em modelos para determinar o tipo de um parâmetro de modelo:

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

Consulte também

Referência

Informações de tipo de tempo de execução

Palavras-chave C++