2013-04-28 66 views
2

我是一位研究高级C++主题的新手,所以如果问题听起来太明显,请原谅我。使用typeid实现RTTI

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

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

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

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

+0

它看起来像你倒退了。 'typeid'可以工作,因为RTTI是在编译器中实现的,所以询问是否使用'typeid'“来实现RTTI”看起来很混乱。 “实施RTTI”是什么意思? – 2013-04-28 18:40:44

+0

你试图解决什么问题让你觉得你需要RTTI和/或typeid? – quamrana 2013-04-28 18:41:31

+2

C++ RTTI系统是[反射](http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29)的一个非常差和功能较少的变体。我个人的观点是,无论使用哪种语言,都应尽可能避免设计中的任何反射需求。 – 2013-04-28 18:43:17

回答

6

重要:
理想的情况下,如果你需要确定你需要重新审视你的设计对象的类型,因为很有可能你错过了什么那里,你违反了OOP的SOLID规则。

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

你可以在使用的大多数编译器的实现细节,
Technical Report on C++ Performance

有关摘录:

5.3.7类型信息

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


5.3.8动态角色

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

1

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