5

我正在使用Visual Studio 2005 Proffesional Edition。C++ typeid运算符

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

typeid(SomeClass).raw_name() // the value of this is "[email protected]@" 
typeid(SomeClass).name()   /// "class SomeClass" 

SomeClass obj; 
typeid(obj).raw_name(); // "[email protected]@" 
typeid(obj).name();  // "class TLomeClass" 
+2

0%宽高比。不会回答这个问题。特别是在我发现我已经支持你的一个问题之后。 :-) – 2009-12-23 20:20:16

+0

什么问题:) – user152508 2009-12-23 20:22:59

+0

我看到的问题已得到解决 - 接受对您的问题最有用的答案使用复选标记。 – 2009-12-23 20:29:49

回答

2

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

typeid,当它被施加到多态类型,返回type_info对象标识动态型多态性的对象。因此,举例来说,如果应用typeidBase &类型(其中Base是多态)的参考,这实际上是绑定到Derived类型(其中DerivedBase衍生)的目的,通过typeid返回的type_info对象将对应于Derived班,而不是Base班。难道这是类似的事情发生在你的代码?

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

P.S.与目前接受的答案中所陈述的相反,typeid是完全和完全标准的C++功能。它不是一个编译器扩展。

+0

是的,你是对的。在我的例子中,我有一个库函数返回指向派生类对象的基指针。然而,该函数的签名是Base * function(),并且在库文档Base类中作为叶类展开,即没有类指定从它继承。但我想是的,该函数实际上是返回一个指向更多派生类的指针,这在文档库中没有提到。即如果我这样说: Base baseObj; Base * basePtr = fucntion(); 然后下面的语句为真 typeof(baseObj)!= typeof(* basePtr) – user152508 2009-12-27 13:40:40

1

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

运算符的行为不是由C++标准定义的,因此是编译器扩展。除非供应商明确记录,否则您不能依赖其行为,也不能有任何合理的期望来查明它为什么会按照它的方式进行操作。它的行为在VS2008中可能已经改变,并且可能与VS2003不同。 (它肯定不同于GCC,ICC和各种其他编译器。)

+0

谢谢你的回复。这对我很有帮助。其实,经过一番调查后,我得出结论说,卖方有一些特定类别的无证未来。 – user152508 2009-12-24 08:01:08

+0

对不起:什么?运算符'typeid'由C++标准清楚明确地定义。它不是一个编译器扩展。 – AnT 2009-12-26 06:01:08

+0

是的,typeid在标准中是8defined *,但它的*行为*不是。唯一明确的要求是:'typename A a1,a2; assert(typeof(a1)== typeof(a2));'除此之外的任何东西,通过我的阅读,是一个扩展。 – greyfade 2009-12-26 06:07:45