c++ vtable是什么 c++虚函数表工作原理【底层】

发布时间 - 2026-01-31 00:00:00    点击率:
vtable是C++运行时多态的核心机制,由编译器为含虚函数的类生成只读函数指针数组,按声明顺序存储虚函数地址;对象首部隐式包含vptr指向对应vtable,调用时通过vptr+vtable索引动态分派。

vtable(虚函数表)是 C++ 实现运行时多态的核心底层机制。它不是语言标准强制规定的结构,但所有主流编译器(如 MSVC、GCC、Clang)都采用类似方案:每个含虚函数的类,在编译期生成一张只读的函数指针数组,存放该类所有虚函数的实际地址——这就是 vtable。

vtable 是怎么生成和组织的?

编译器为每个含虚函数的类单独生成一张 vtable,按虚函数在类中声明的顺序依次填入地址:

  • 基类的 vtable 包含其自身所有虚函数地址,索引从 0 开始连续排列;
  • 派生类继承基类 vtable 布局,重写的虚函数会覆盖对应索引位置的地址;
  • 派生类新增的虚函数则追加到表尾,不打乱原有索引顺序;
  • vtable 存储在程序的 .rodata 段,所有同类对象共享同一份,只读且全局唯一。

vptr 怎么把对象和 vtable 连

起来?

每个含虚函数的类的对象,内存布局开头隐式插入一个指针成员,叫 vptr(虚表指针),大小为 4 字节(x86)或 8 字节(x64):

  • vptr 在对象构造时由编译器自动初始化,指向其静态类型对应的 vtable;
  • 例如 Derived d; 的 vptr 指向 Derived 类的 vtable,哪怕用 Base* ptr = &d; 持有,vptr 仍不变;
  • 该指针始终位于对象内存首地址,可通过 *(void**)(&obj) 直接取到(调试/教学用途,生产代码勿用)。

调用虚函数时发生了什么?

当通过基类指针或引用调用虚函数(如 ptr->func()),实际执行分四步:

  • ptr 所指对象的首地址读出 vptr;
  • 通过 vptr 找到对应类的 vtable 起始地址;
  • 根据 func 在基类中声明的顺序,查其在 vtable 中的固定偏移(比如第 0 项);
  • 取出该位置存储的函数地址,跳转执行——此时若对象是派生类实例,取到的就是派生类重写后的地址。

为什么不用每个对象存全部函数指针?

直接在对象里放 10 个函数指针,1000 个对象就浪费数 KB 内存。vtable 方案把重复数据上提至类级别,每个对象只增一个 vptr,空间开销极小,且继承时只需复用+局部覆盖,逻辑清晰、高效可靠。


# 字节  # c++  # 排列  # 为什么  # 多态  # 引用调用  # void  # 指针  # 继承  # 虚函数  # 对象  # 派生类  # 重写  # 类中  # 隐式  # 这就是  # 是怎么  # 只需  # 跳转  # 可通过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何破解联通资金短缺导致的基站建设难题?  长沙企业网站制作哪家好,长沙水业集团官方网站?  jQuery中的100个技巧汇总  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在建站之星绑定自定义域名?  如何用AWS免费套餐快速搭建高效网站?  Laravel如何记录自定义日志?(Log频道配置)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何为不同团队 ID 动态生成多个非值班状态按钮  如何用花生壳三步快速搭建专属网站?  网站制作软件有哪些,制图软件有哪些?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何实现文件上传和存储?(本地与S3配置)  在线教育网站制作平台,山西立德教育官网?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  简单实现jsp分页  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  javascript中闭包概念与用法深入理解  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  用v-html解决Vue.js渲染中html标签不被解析的问题  如何基于云服务器快速搭建个人网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  C++时间戳转换成日期时间的步骤和示例代码  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  linux top下的 minerd 木马清除方法  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  高防服务器租用指南:配置选择与快速部署攻略  西安专业网站制作公司有哪些,陕西省建行官方网站?  黑客如何通过漏洞一步步攻陷网站服务器?  北京网站制作的公司有哪些,北京白云观官方网站?  历史网站制作软件,华为如何找回被删除的网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何处理表单验证?(Requests代码示例)  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel模型事件有哪些_Laravel Model Event生命周期详解  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  EditPlus中的正则表达式实战(5)  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  如何用免费手机建站系统零基础打造专业网站?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  高端企业智能建站程序:SEO优化与响应式模板定制开发  JS中页面与页面之间超链接跳转中文乱码问题的解决办法