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中页面与页面之间超链接跳转中文乱码问题的解决办法

