恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

多态的理解,虚函数表的理解

  • 首页
  • 资讯中心
  • /
  • 多态的理解,虚函数表的理解

相关资讯

类模板模板参数的全部使用场景 2026/8/20 0:02:06
构建个人数字信息管理系统:从ESticky理念到实践 2026/8/19 23:57:06
新手必看!OpenClaw 2.9.3Windows部署报错、网关离线终极解决办法 2026/8/19 23:57:06

最新资讯

AMD Ryzen 7 2700E低功耗处理器:从市场逻辑到实战调校全解析
Awoo Installer 教程:3 种把游戏装进 Switch 的方法,新手也能一次上手
单片机计算机毕设之室内空气污染物智能预警与通风控制系统设计 —— 以 STM32 为核心 基于 STM32 的多传感器融合空气质量监测终端设计与实现(010104)
单片机计算机毕设之基于 STM32/51 单片机的本地交互式环境监测预警硬件系统设计 基于 STM32/51 单片机的室内环境指标采集与超限处理系统设计(024503)
单片机计算机毕设之基于 STM32 或 51 单片机的多路温湿度状态指示预警系统设计 基于单片机按键配置阈值的温湿度无线监测系统设计(024403)
多任务模型评测工具选型,别只比较参数

今日推荐

类模板模板参数的全部使用场景
多态的理解,虚函数表的理解
C++ 类编译器自动生成的默认函数 | 拷贝构造函数 vs 拷贝赋值运算符(赋值构造)

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

多态的理解,虚函数表的理解

发布时间:2026/8/20 0:02:06
多态的理解,虚函数表的理解 #include iostream using namespace std; class Plane { public: virtual void fly() { cout "灰机正在飞行" endl; } virtual void showInfo() { cout "灰机正在展示" endl; } }; class AirBus : public Plane { public: void fly() override { cout "空中客车在飞行" endl; } void showInfo() override { cout "空中客车正在展示" endl; } }; class J20 : public Plane { public: void fly() override { cout "J20正在隐形战斗寻航" endl; } }; int main() { Plane* plane = new AirBus; return 0; }分析代码逐段 + 内存布局 + 调用逻辑完整解析1. 内存情况(64 位 MSVC)new AirBus在堆上创建一个AirBus 对象单继承,只有一份__vfptr(虚函数表指针,占 8 字节)对象没有任何成员变量,所以堆上对象总大小:8字节堆内存(AirBus 对象)堆地址 ┌────────────────────┐ │ __vfptr │───→ AirBus 的虚函数表 vftable └────────────────────┘AirBus 虚函数表 vftable表格下标存放函数地址[0]AirBus::fly[1]AirBus::showInfo虚函数本身代码放在代码段,不在堆对象里;对象只存虚表指针。栈上变量Plane* plane:这是指针变量,栈上占8 字节保存堆上 AirBus 对象的起始地址。注意:指针的类型是Plane*,但它存的是实打实 AirBus 对象的堆地址。 VS 调试窗口看到:plane Plane* {AirBus},代表静态类型 Plane*,实际动态类型 AirBus。2. 补充两条调用看效果plane-fly(); plane-showInfo();执行流程(动态绑定、多态)拿plane中保存的堆对象地址,找到对象头部__vfptr__vfptr指向 AirBus 虚函数表fly()取虚表[0],调用AirBus::fly→ 输出:空中客车在飞行showInfo()取虚表[1],调用AirBus::showInfo→ 输出:空中客车正在展示3. 对比 J20Plane* p2 = new J20; p2-fly(); // J20重写fly,虚表[0] = J20::fly,输出J20正在隐形战斗寻航 p2-showInfo(); // J20没有重写showInfo,虚表[1] = Plane::showInfo,输出灰机正在展示J20 虚函数表表格下标函数地址[0]J20::fly[1]Plane::showInfo4. 重点回顾单继承关键点单继承,无论多少个 virtual,对象永远只有 1 个__vfptr;子类 override 重写虚函数,不去修改对象里的__vfptr 本身,而是修改虚表里面存储的函数地址;override只是编译期检查:确保父类有这个虚函数,不会改变内存布局;VS 调试看到两个__vfptr,是调试器 UI 重复展开,堆内存物理上就一份;只有多重继承、两个互不相关父类各自带虚函数,对象内存才出现多份独立__vfptr。5. 内存大小汇总(64 位 MSVC)表格类型sizeof说明Plane8仅__vfptrAirBus8继承,无新增成员变量,一份__vfptrJ208继承,无新增成员变量,一份__vfptrPlane*8指针本身大小,和指向什么对象无关6. 内存泄漏提醒代码中new AirBus堆分配,没有写delete plane;,程序退出前没有释放堆内存,造成内存泄漏。cppint main() { Plane* plane = new AirBus; delete plane; //释放堆对象 return 0; }⚠这里有个重要知识点:基类析构函数如果不是 virtual,delete 基类指针不会正确调用子类析构!给你演示坑:cppclass Plane { public: virtual void fly(){} //~Plane(){} //普通析构,不是virtual,delete plane;只会调用Plane析构,不会调用AirBus析构! virtual ~Plane(){} //✅虚析构,多态delete才完整释放子类资源 };

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号