You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,编译器生成的代码逻辑是:

  1. 取出对象里的虚表指针(每个带虚函数的对象都有一个隐藏的虚表指针成员)
  2. 从虚表的固定位置读取type_info指针
  3. 通过这个指针拿到对应的RTTI信息,从而确定对象的实际类型

这种实现方式直接高效,不需要额外的全局映射表——虚表本身就和类一一绑定,RTTI信息直接关联在虚表中,自然就能通过虚表找到对应的类型信息。

内容的提问来源于stack exchange,提问作者Andrey Rubliov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:28:12