c ++ typeid运算符

时间:2009-12-23 20:14:02

标签: c++ visual-studio visual-studio-2005 compiler-construction

我使用的是Visual Studio 2005 Proffesional Edition。

在下面的示例中,SomeClass是在我使用的第三方DLL库中定义的类。 SomeClass有虚拟方法。我注意到,当应用于类型本身时,以及应用于该类型的对象时,运算符typeid会给出不同的结果。这是正常行为,如果不是这种行为的原因可能是什么原因?

typeid(SomeClass).raw_name()   // the value of this is   ".?AVSomeClass@@"
typeid(SomeClass).name()          ///  "class SomeClass"

SomeClass obj;
typeid(obj).raw_name(); // ".?AVTLomeClass@@"
typeid(obj).name();       // "class TLomeClass"

2 个答案:

答案 0 :(得分:2)

您的问题中的代码是否与您遇到问题的代码相同或相似?

运算符typeid,当它应用于多态类型时,返回标识多态对象的动态类型的type_info对象。因此,例如,如果您将typeid应用于Base &类型的引用(其中Base是多态的),它实际上绑定到Derived类型的对象(其中Derived派生自Base},type_info返回的typeid对象将对应Derived类,而不是Base类。可能是你的代码中发生了类似的事情吗?

此外,在某些编译器(如MS Visual Studio)中,为了使用功能齐全的typeid,如上所述,您需要在启用运行时类型信息(RTTI)的情况下编译代码。也许没有RTTI导致你观察到的奇怪效果。

P.S。与当前接受的答案中所述相反,typeid是完全标准的C ++特性。它不是编译器扩展。

答案 1 :(得分:1)

此行为的原因记录在某处on MSDN。您在此特定情况下看到的特定行为可能是由于某些使用继承或某些编译器扩展而未由.DLL供应商记录。

运算符的行为不是由C ++标准定义的,因此是编译器扩展。你不能依赖它的行为,也不能有任何合理的期望找到它为什么以它的方式做它所做的事情,除非供应商明确记录。它的行为可能在VS2008中发生了变化,可能与VS2003不同。 (它当然不同于GCC,ICC和其他各种编译器。)