Share via


operador typeid

typeid( type-id )
typeid( expression )

Comentarios

El operador de typeid permite que determinan el tipo de un objeto en tiempo de ejecución.

El resultado detypeid es un type_information& const.El valor es una referencia a un objeto de type_information que representa el tipo-identificador o el tipo de la expresión, dependiendo del formulario de typeid se utiliza.Vea clase de type_information para obtener más información.

El operador de typeid no funciona con los tipos administrados (los declarantes abstractos o instancias), vea typeid para obtener información sobre cómo obtener Type de un tipo especificado.

El operador de typeid hace una comprobación en tiempo de ejecución cuando se aplica a un valor l de un tipo polimórfico de la clase, donde el tipo real del objeto no se puede determinar mediante la información estática proporcionada.Estos casos son:

  • una referencia a una clase

  • un puntero, desreferenciado con *

  • un puntero subscripted (es decir.[ ]).(Observe que normalmente no es seguro utilizar un subíndice con un puntero a un tipo polimórfico).

Si los puntos de la expresión a un tipo de clase base, con todo el objeto es realmente de un tipo derivado de la clase base, una referencia de type_information para la clase derivada es el resultado.la expresión debe señalar a un tipo polimórfico (una clase con funciones virtuales).si no, el resultado es type_information para la clase estática mencionada en la expresión.Además, el puntero debe desreferenciar para utilizar el objeto que elija.Sin desreferenciar el puntero, el resultado será type_information para el puntero, no lo señala.Por ejemplo:

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

Si la expresión desreferencia un puntero, y el valor del puntero es cero, typeid produce excepción de bad_typeid.Si el puntero no señala a un objeto válido, una excepción de __non_rtti_object se produce, que indica un intento de analizar el RTTI que activó un error (como la infracción de acceso), ya que el objeto es de algún modo no válido (el puntero incorrecta o el código no fue compilado con /GR).

Si la expresión no es un puntero o una referencia a una clase base del objeto, el resultado es una referencia de type_information que representa el tipo estático de la expresión.El tipo estático de una expresión hace referencia al tipo de una expresión mientras se conoce en tiempo de compilación.Se omite la semántica de ejecución al evaluar el tipo estático de una expresión.Además, se omiten las referencias cuando es posible al determinar el tipo estático de una expresión:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeid también se puede utilizar en plantillas para determinar el tipo de un parámetro de plantilla:

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

Vea también

Referencia

Información en tiempo de ejecución

Palabras clave de C++