RTTI如何在运行时识别多态类型对象的所属类?
C++多态类RTTI与虚表的实现细节
先看这段示例代码:
struct B { virtual ~B() {} }; struct D : B {}; int main() { B* b = new D; cout << typeid(*b).name() << endl; }
它的输出是 1D,说明typeid能正确识别基类指针B实际指向的派生类D。
你提到RTTI存放在进程的常量内存里,原本以为虚表只存虚函数指针,现在疑问:多态类的RTTI是靠一张虚表指针映射到typeinfo的全局表实现的吗?
答案是没有这种全局映射表,虚表本身就包含了RTTI的指针。
对于带虚函数的类,编译器生成的虚表结构通常是这样的:
- 虚表的首个元素(或固定偏移位置)就是指向该类
type_info对象的指针 - 后面跟着的才是该类的各个虚函数指针
当对多态类型调用typeid时,编译器生成的代码逻辑是:
- 取出对象里的虚表指针(每个带虚函数的对象都有一个隐藏的虚表指针成员)
- 从虚表的固定位置读取
type_info指针 - 通过这个指针拿到对应的RTTI信息,从而确定对象的实际类型
这种实现方式直接高效,不需要额外的全局映射表——虚表本身就和类一一绑定,RTTI信息直接关联在虚表中,自然就能通过虚表找到对应的类型信息。
内容的提问来源于stack exchange,提问作者Andrey Rubliov
相关产品推荐
相关产品推荐

