我是高级C++主题研究的新手,所以如果问题听起来太明显,请原谅我.
我一直在阅读各种方法,通过它们可以在C++中获取运行时对象类型的信息,通常称为RTTI.
但是,我很困惑它是如何工作的.我已经阅读了一些在解释RTTI时经常提到的事情.其中之一是使用dynamic_cast <>动态地将对象强制转换为其他对象.另一个是使用typeid来确定运行时对象的类型.
我想知道使用typeid是否是在C++中实现RTTI的正确方法,如果是,那么typeid运算符实际上如何能够在运行时确定对象的类型(它是否分析了对象blob的位模式)记忆?)
如果使用typeid不是正确的方法,那么请为其实现建议一些其他方法.
重要:
理想情况下,如果您需要识别对象的类型,则需要重新访问您的设计,因为很可能您错过了某些内容,并且您违反了OOP 的SOLID规则.
C++标准提供dynamic_cast并typeid作为两个确定的方式类型的一个对象.两者都有其优点和局限性.它们如何识别类型是依赖于实现的细节,但通常它们通过维护指向对象的vtable中的类型信息结构的指针来实现.如果你完全不知道vtable是什么,Marshal Clines C++ Faq 在这里提供了一个很好的解释.
您可以在"C++性能技术报告"中找到大多数编译器使用的实现细节
相关提取:
5.3.7类型信息
给定多态类的对象(具有至少一个虚函数的类),可以通过使用typeid运算符获得type_info对象.原则上,这是一个简单的操作,包括查找虚函数表,通过查找对象所属的最派生类对象,然后从该对象的虚函数表(或等效对象)中提取指向type_info对象的指针).
5.3.8动态演员
给定指向多态类对象的指针,可以使用dynamic_cast完成对指向同一派生类对象的另一个基础子对象的指针的强制转换.原则上,此操作涉及查找虚函数表,通过查找对象所属的最派生类对象,然后使用与该对象关联的类型信息来确定是否允许转换(强制转换),最后执行此指针的任何所需调整.原则上,此检查涉及遍历描述最派生类的基类的数据结构.因此,dynamic_cast的运行时成本可能取决于所涉及的两个类的类层次结构中的相对位置.