我使用的是 Visual Studio 2005 专业版。
在下面的示例中,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"
您问题中的代码与您遇到问题的代码相同或相似吗?
运算符
typeid
,当它应用于多态类型时,返回标识多态对象的dynamic类型的
type_info
对象。因此,例如,如果将 typeid
应用于 Base &
类型的引用(其中 Base
是多态的),则该引用实际上绑定到 Derived
类型的对象(其中 Derived
派生自 Base
),type_info
返回的typeid
对象将对应于Derived
类,而不是Base
类。您的代码中是否会发生类似的事情?
此外,在某些编译器(如 MS Visual Studio)中,为了使用功能齐全的
typeid
,如上所述,您需要在启用运行时类型信息 (RTTI) 的情况下编译代码。也许 RTTI 的缺失导致了您观察到的奇怪效果。
附注与当前接受的答案中所述相反,
typeid
是完全且完美的标准 C++ 功能。它不是编译器扩展。
此行为的原因记录在 MSDN 上。您在这种特殊情况下看到的特定行为可能是由于某些继承的使用或某些编译器扩展造成的,.DLL 的供应商没有记录。
该运算符的行为不是由 C++ 标准定义的,因此是编译器扩展。您不能依赖它的行为,也不能有任何合理的期望来找出它为什么这样做,除非供应商明确记录了它。它的行为在 VS2008 中可能发生了变化,并且可能与 VS2003 不同。 (它当然不同于 GCC、ICC 和各种其他编译器。)