use*_*508 5 c++ compiler-construction visual-studio-2005 visual-studio
我正在使用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"
Run Code Online (Sandbox Code Playgroud)
您问题中的代码与您遇到问题的代码相同或相似吗?
Operatortypeid应用于多态类型时,返回type_info标识多态对象的动态类型的对象。因此,例如,如果您应用typeid类型Base &(其中Base是多态)的引用,该引用实际上绑定到类型Derived(其中Derived派生自Base)的对象,则type_info返回的对象typeid将对应于Derived类,而不是Base类。您的代码中是否会发生类似的事情?
此外,在某些编译器(如 MS Visual Studio)中,为了使用功能齐全的typeid,如上所述,您需要在启用运行时类型信息 (RTTI) 的情况下编译代码。也许 RTTI 的缺失导致了您观察到的奇怪效果。
PS 与当前接受的答案中所述相反,typeid是完全且完美的标准 C++ 功能。它不是编译器扩展。