typeid运算符

typeid( type-id )
typeid( expression )

备注

typeid 使用运算符对象的类型将确定运行时。

typeid 的结果是 const type_info 。 该值是对表示 类型 ID表达式的类型, typeid 的窗体使用的 type_info 对象。 请参见 type_info 类 有关更多信息。

typeid 运算符不与托管类型一起使用 (抽象声明或实例),请参见 typeid 有关获取特定类型的 Type 的信息。

typeid 运算符执行运行时检查,在对多态类类型的左值时,对象的实际类型不能依赖于所提供的静态信息。 这类情况是:

  • 对类的引用

  • 指针,取消引用与 *

  • 一 subscripted 指针 (即。 [ ]). (请注意用于指针的一个下标到多态类型。) 通常是不安全的。

如果 表达式 指向基类类型,,对象实际上是从该基类派生的类型, type_info 为派生类的引用是结果。 该 表达式 必须指向多态类型 (处理虚函数的类)。 否则,结果是该 表达式引用的静态类的 type_info 。 此外,它指向必须取消引用的指针,以便使用对象。 未取消引用指针,则结果将是指针的 type_info ,不将指向。 例如:

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

如果 表达式 取消引用指针,因此,该指针的值为零, typeid 引发 bad_typeid 异常。 如果指针不指向有效的对象, __non_rtti_object 引发异常,指示尝试分析触发错误的 RTTI (如访问冲突),,因为对象是以某种方式无效 (无效指针或代码不是用 /GR)。

如果 表达式 不是指针和对对象的基类,则结果是 type_info 引用表示形式 表达式。 ,当在编译时已知, 静态 表达式引用表达式的类型。 静态类型,在计算表达式时,执行语义被忽略。 此外,引用将被忽略,如果可能,在确定静态表达式时:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeid 还可用于模板确定模板参数的类型:

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

请参见

参考

运行时类型信息

C++关键字