使用typeid实现RTTI

时间:2013-04-28 18:37:31

标签: c++ oop rtti

我是高级C ++主题研究的新手,所以如果问题听起来太明显,请原谅我。

我一直在阅读各种方法,通过它们可以在C ++中获取运行时对象类型的信息,通常称为RTTI。

但是,我很困惑它是如何运作的。 我已经阅读了一些在解释RTTI时经常提到的事情。其中之一是使用dynamic_cast<>动态地将对象强制转换为其他对象。另一个是使用typeid来确定运行时对象的类型。

我想知道使用typeid是否是在C ++中实现RTTI的正确方法,如果是,那么typeid运算符实际上如何能够在运行时确定对象的类型(它是否分析了内存中的对象blob?)

如果使用typeid不是正确的方法,那么请为其实现提出一些其他方法。

2 个答案:

答案 0 :(得分:6)

重要:
理想情况下,如果您需要识别对象的类型,则需要重新访问您的设计,因为很可能您错过了某些内容并且违反了 SOLID 规则OOP。

C ++标准提供了dynamic_casttypeid作为确定对象的类型的两种方法。两者都有其优点和局限性。它们如何识别类型是一个依赖于实现的细节,但通常是通过在对象的vtable中维护指向类型信息结构的指针来实现的。如果你完全不知道vtable是什么,Marshal Clines C ++ Faq提供了一个很好的解释 here

您可以在中找到大多数编译器使用的实现细节 的 Technical Report on C++ Performance

相关提取:

  

5.3.7类型信息

     

给定多态类的对象(具有至少一个虚函数的类),a   可以通过使用typeid运算符获取type_info对象。在   原理,这是一个简单的操作,涉及查找虚函数表,   通过找到对象所属的最派生类对象,然后从该对象的虚函数表中提取指向type_info对象的指针(或者   当量)。


  

5.3.8动态演员

     

给定指向多态类对象的指针,指向另一个基类的指针   可以使用dynamic_cast完成相同派生类对象的子对象。在   原则上,该操作涉及通过该发现找到虚函数表   对象所属的派生程度最高的类对象,然后使用类型信息   与该对象相关联以确定是否允许转换(强制转换),最后   执行此指针的任何所需调整。原则上,这个检查   涉及遍历描述最派生的基类的数据结构   类。因此,dynamic_cast的运行时成本可能取决于相对位置   在所涉及的两个类的类层次结构中。

答案 1 :(得分:1)

RTTI仅适用于具有虚函数的类的实例。在这种情况下,编译器向类中添加一个特殊成员来调用虚拟表指针。每个具有虚函数的类都有自己的虚拟表。通过检查指向哪个虚拟表,可以确定对象的特定类型。