Compartilhar via


Operador typeid

typeid( type-id ) 
typeid( expression )

Comentários

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

O resultado de typeid é const type_info&. O valor é uma referência a um objeto type_info que representa o type-ID ou o tipo da expressão, dependendo do formato de typeid usado. Consulte a classe type_info para obter mais informações.

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

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

  • Uma referência à classe

  • Um ponteiro, desreferenciado com *

  • Um ponteiro subscrito (isto é, []). (Geralmente, não é seguro usar um subscrito com um ponteiro para um tipo polimórfico.)

Se a expressão aponta para um tipo de classe base, mas o objeto é na realidade um tipo derivado dessa classe base, uma referência a type_info para a classe derivada é o resultado. A expressão deve apontar para um tipo polimórfico (uma classe com funções virtuais). Caso contrário, o resultado será type_info para a classe estática referenciada na expressão. Além disso, o ponteiro deve ser desreferenciado de forma que o objeto para o qual ele aponta seja usado. Sem desreferenciar o ponteiro, o resultado será type_info para o ponteiro, não para 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 a expressão estiver desreferenciando um ponteiro e o valor desse ponteiro for zero, typeid lançará uma exceção bad_typeid. Se o ponteiro não apontar para um objeto válido, uma exceção __non_rtti_object será lançada, indicando uma tentativa de analisar o RTTI que acionou uma falha (como violação de acesso), pois o objeto é de algum modo inválido (o ponteiro incorreto ou o código não foram compilados com /GR).

Se a expressão não é um ponteiro ou uma referência a uma classe base do objeto, o resultado será uma referência a type_info que representa o tipo estático da expressão. O tipo estático de uma expressão se refere ao tipo de uma expressão, como se sabe no tempo de compilação. A semântica da 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 para 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 do 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++