我是研究高级C++主题的新手,所以如果这个问题听起来太明显,请原谅我。
我一直在阅读各种方法,我们可以通过这些方法在C++中获得运行时对象类型的信息,通常称为RTTI。
但是,我对它是如何工作的感到困惑。我读过一些在解释RTTI时经常提到的东西。其中之一是使用dynamic_cast<>将一个对象动态转换为其他对象。另一种是使用typeid在运行时确定对象的类型。
我想知道使用typeid是否是在C++中实现RTTI的正确方法,如果是,那么typeid操作符实际上如何能够在运行时确定对象的类型(它是否分析内存中对象blob的位模式?)
如果使用typeid不是正确的方法,那么请建议一些其他方法来实现它。
发布于 2013-04-29 02:42:26
重要信息:
理想情况下,如果你需要识别一个对象的类型,你需要重新审视你的设计,因为你很可能遗漏了一些东西,并且你违反了OOP的规则。
C++标准提供了dynamic_cast和typeid作为确定对象类型的两种方法。两者都有各自的优点和局限性。它们如何识别类型是一个依赖于实现的细节,但它们通常是通过在对象的vtable中维护指向类型信息结构的指针来实现的。如果你完全不知道什么是vtable,Marshal Clines C++常见问题解答提供了一个很好的解释。
你可以找到大多数编译器使用的实现细节,
相关摘录:
5.3.7类型信息
给定一个多态类的对象(一个至少有一个虚函数的类),可以通过使用type_info操作符获得类型对象。原则上,这是一个简单的操作,包括查找虚拟函数表,通过查找对象所属的派生最多的类对象,然后从该对象的虚拟函数表(或等效对象)中提取指向type_info对象的指针。
5.3.8动态转换
给定指向多态类的对象的指针,可以使用dynamic_cast完成到指向同一派生类对象的另一个基子对象的指针的转换。原则上,此操作涉及查找虚拟函数表,通过查找对象所属的派生最多的类对象,然后使用与该对象关联的类型信息来确定是否允许转换(强制转换),最后执行this指针的任何所需调整。原则上,这种检查涉及遍历描述最多派生类的基类的数据结构。因此,dynamic_cast的运行时成本可能取决于所涉及的两个类在类层次结构中的相对位置。
发布于 2013-04-29 02:41:29
RTTI仅适用于具有虚函数的类的实例。在这种情况下,编译器会向类中添加一个特殊的成员,称为虚拟表指针。每个具有虚拟函数的类都有自己的虚拟表。通过检查哪个虚拟表被指向,可以确定对象的特定类型。
https://stackoverflow.com/questions/16266339
复制相似问题