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

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

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

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

相关文章:

  • 文入门Ubuntu:从零到精通的Linux之旅
  • 数学建模-整数规划(IP)
  • FunASR语音识别框架流式识别模型切换
  • SpringBoot的条件装配原理
  • SpringBoot3集成Oauth2.1——10重启程序Token失效(RSA持久化)
  • Java项目-苍穹外卖_Day1
  • Visual Studio 2022调试Eigen库查看矩阵与向量的值
  • 大模型知识点之矩阵乘以向量
  • springboot:前后端调用(axios发送异步请求)
  • 那我现在有3个输入 9层神经元 每层神经元数为 3 9 3 5 6 2 3 9 8 请给出我所有的权重矩阵
  • 图论水题5
  • ansible的搭建与安装
  • BIO、NIO 和 AIO
  • 智慧城市SaaS平台/交通设施运行监测系统之桥梁运行监测、城市道路塌陷风险运行监测系统架构内容
  • v-slot 与 slot-scope区别
  • 开源零信任本地化部署实战指南:Keycloak + OpenZiti 完整方案
  • [element-plus] el-table在行单击时获取行的index
  • JAVA高级工程师--云服务模式多租户SAAS项目商业模式架构全景
  • 【数据可视化-98】2025年上半年地方财政收入Top 20城市可视化分析:Python + Pyecharts打造炫酷暗黑主题大屏
  • 【Java基础】快速掌握Java泛型机制:基本概念与具体应用
  • 工具系列:JsonViewKit
  • Frida 加密解密算法实现与应用指南
  • kafka 原理详解
  • 代码随想录算法训练营30天 | ​​01背包理论基础、416. 分割等和子集
  • Radxa Rock 5B vs Rock 5B+ 、香橙派、鲁班猫、正点原子及RK3588 的AI/音视频任务的选择
  • springboot项目每次启动关闭端口仍被占用
  • 第 93 场周赛:二进制间距、重新排序得到 2 的幂、优势洗牌、最低加油次数
  • Agent实战教程:LangGraph相关概念介绍以及快速入门
  • Reachability Query
  • 算法每日一题 | 入门-分支结构-肥胖问题