当前位置: 首页 > news >正文

如何通过虚函数实现多态?

        多态分为静态多态和动态多态。C++ 中多态的实现使用的是动态绑定的技术,该技术的核心是虚函数表。首先在基类中用 virtual 关键字声明虚函数,编译器会为该类及子类生成专属的 “虚函数表(vtable)”,且每个实例化对象会隐藏一个 “虚表指针(vptr)”,指向所属类的虚函数表;接着让子类重写基类虚函数,并通过基类指针或引用指向子类对象;当调用虚函数时,程序不会在编译期绑定函数,而是在运行期通过对象的 vptr 找到对应类的 vtable,取出重写后的虚函数地址执行。最终实现 “同一接口,不同实现” 的多态效果。

  • 虚函数:用 virtual 关键字声明的函数,称为 “虚函数”。当一个类(B)继承另一个类(A)时,类 B 会继承类 A 的函数的调用权,所以如果一个父类包含了虚函数,那么其子类也可调用这些虚函数。
  • 虚函数表:每个包含虚函数的类都会有一个虚函数表。虚函数表是一个存放指针的数组,其内的每个元素都会对应一个虚函数的函数指针。虚函数表在编译阶段由编译器为每个包含虚函数的类生成,并且全局唯一(即同一个类的所有对象共享该类的虚函数表)。但子类的虚函数表是在父类虚函数表的基础上构建的:
    • 若子类未重写父类的虚函数,子类的虚函数表中对应位置会直接复用父类虚函数的地址。
    • 若子类重写了父类的虚函数,子类的虚函数表中会用自己的虚函数地址覆盖父类对应位置的地址。
    • 若子类新增了自己的虚函数,这些虚函数地址会被追加到子类虚函数表的末尾(父类虚函数表不包含这些新增函数)。
  • 虚表指针:为了指定每个对象所使用的虚函数表,每个对象内部都会包含一个虚表指针,来指向自己所使用的虚函数表。为了让每个包含虚函数表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针 vptr,用来指向虚函数表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向该类的虚函数表(在构造函数中被赋值)。
http://www.xdnf.cn/news/1366921.html

相关文章:

  • 实现自己的AI视频监控系统-第二章-AI分析模块2
  • 【git使用场景】本地仓库与远程仓库存在独立历史
  • ​Visual Studio + UE5 进行游戏开发的常见故障问题解决
  • 系统开发 Day4
  • 音视频学习(五十六):单RTP包模式和FU-A分片模式
  • Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
  • 深度学习-----《PyTorch深度学习核心应用解析:从环境搭建到模型优化的完整实践指南》
  • 链表OJ习题(2)
  • 操作系统中,进程与线程的定义与区别
  • 似然函数对数似然函数负对数似然函数
  • Ant Design for UI 选择下拉框
  • BIO、NIO 和 AIO
  • 2025.8.25回溯算法-集合
  • Typora + PicList + Gitee 图床完整配置教程
  • 【ElasticSearch】json查询语法和可用的客户端
  • ESP32开发WSL_VSCODE环境搭建
  • Mysql系列--8、索引
  • Java延迟任务实现方案详解:从DelayQueue到实际应用
  • 2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)
  • 【Docker基础】Docker-compose进阶配置:健康检查与服务就绪
  • K8s Pod驱逐机制详解与实战
  • C++ extern 关键字面试深度解析
  • 开源 C++ QT Widget 开发(六)通讯--TCP调试
  • 安全合规:AC(上网行为安全)--下
  • vue 一键打包上传
  • Genymotion 虚拟机如何安装 APK?(ARM 插件安装教程)
  • ICCV 2025|TRACE:无需标注,用3D高斯直接学习物理参数,从视频“预知”未来!
  • 二、添加3D形状
  • More Effective C++ 条款07:不要重载、和,操作符
  • 【系统架构设计师】数据库设计(一):数据库技术的发展、数据模型、数据库管理系统、数据库三级模式