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

一篇文章彻底弄懂C++虚函数的实现机制

1、虚函数简介C中有两种方式实现多态即重载和覆盖。重载是指允许存在多个同名函数而这些函数的参数表不同参数个数不同、参数类型不同或者两者都不同。覆盖是指子类重新定义父类虚函数的做法简而言之就是用父类型别的指针指向其子类的实例然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针拥有“多种形态”这是一种泛型技术。所谓泛型技术说白了就是试图使用不变的代码来实现可变的算法比如模板元编程是在编译期完成的泛型技术RTTI、虚函数则是在运行时完成的泛型技术。关于虚函数的具体使用方法建议大家先去阅读相关的C的书籍本文只剖析虚函数的实现机制让大家对虚函数有一个更加清晰的认识并不对虚函数的具体使用方法作过多介绍。本文是依据个人经验和查阅相关资料最终编写的如有错漏希望大家多多指正。2、虚函数表简介学过C的人都应该知道虚函数Virtual Function是通过虚函数表Virtual Table简称为V-Table来实现的。虚函数表主要存储的是指向一个类的虚函数地址的指针通过使用虚函数表继承、覆盖的问题都都得到了解决。假如一个类有虚函数当我们构建这个类的实例时将会额外分配一个指向该类虚函数表的指针当我们用父类的指针来操作一个子类的时候这个指向虚函数表的指针就派上用场了它指明了此时应该使用哪个虚函数表而虚函数表本身就像一个地图一样为编译器指明了实际所应该调用的函数。指向虚函数表的指针是存在于对象实例中最前面的位置这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下这就意味着理论上我们可以通过对象实例的地址得到这张虚函数表实际上确实可以做到然后对虚函数表进行遍历并调用其中的函数。前面说了一大堆理论中看不中用下面还是通过一个实际的例子验证一下前面讲的内容首先定义一个Base类该类有三个虚函数代码如下1234567891011121314151617181920212223#include iostream#include stringtypedefvoid(*Fun)(void);classBase{public:virtualvoidf(){std::cout Base::f() std::endl;}virtualvoidg(){std::cout Base::g() std::endl;}virtualvoidh(){std::cout Base::h() std::endl;}};接下来按照前面的说法我们通过Base类的实例对象base来获取虚函数表代码如下1234567891011121314151617181920intmain(intargc,char* argv[]){Base base;Fun fun nullptr;std::cout 指向虚函数表指针的地址 (long*)(base) std::endl;std::cout 虚函数表的地址 (long*)*(long*)(base) std::endl;fun (Fun)*((long*)*(long*)(base));std::cout 虚函数表中第一个函数的地址 (long*)fun std::endl;fun();fun (Fun)*((long*)*(long*)(base) 1);std::cout 虚函数表中第二个函数的地址 (long*)fun std::endl;fun();fun (Fun)*((long*)*(long*)(base) 2);std::cout 虚函数表中第三个函数的地址 (long*)fun std::endl;fun();}运行结果图2-1所示Linux 3.10.0 GCC 4.8.5图2-1 程序运行结果在上面的例子中我们通过把base强制转换成long *来取得指向虚函数表的指针的地址然后对这个地址取值就可以得到对应的虚函数表了。得到对应虚函数表的首地址后就可以通过不断偏移该地址依次得到指向真实虚函数的指针了。这么说有点绕也有点晕下面通过一幅图解释一下前面说的内容详见图2-2图2-2 基类虚函数表内存布局当然上述内容也可以在GDB中调试验证后续的内容也将全部在GDB下直接验证调试的示例见图2-3图2-3 GDB查看基类虚函数表内存布局3、有继承关系的虚函数表剖析前面分析虚函数表的场景是没有继承关系的然而在实际开发中没有继承关系的虚函数纯属浪费表情所以接下来我们就来看看有继承关系下虚函数表会呈现出什么不一样的特点分析的时候会分别就单继承无虚函数覆盖、单继承有虚函数覆盖、多重继承、多层继承这几个场景进行说明。

相关文章:

一篇文章彻底弄懂C++虚函数的实现机制

1、虚函数简介C中有两种方式实现多态,即重载和覆盖。重载:是指允许存在多个同名函数,而这些函数的参数表不同(参数个数不同、参数类型不同或者两者都不同)。覆盖:是指子类重新定义父类虚函数的做法&#xf…...

C语言绘制三角函数曲线

本文实例为大家分享了Android九宫格图片展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下题目&#xff1a;在屏幕上用“*”显示0~360的余弦函数cos(x)曲线。1234567891011121314151617181920212223242526272829303132#include <stdio.h>#include <math.…...

手把手教学:雯雯的后宫-造相Z-Image-瑜伽女孩镜像部署常见问题解决

手把手教学&#xff1a;雯雯的后宫-造相Z-Image-瑜伽女孩镜像部署常见问题解决 1. 镜像概述与核心价值 雯雯的后宫-造相Z-Image-瑜伽女孩是一个专注于生成瑜伽主题图像的AI模型服务。该镜像基于Xinference框架部署&#xff0c;通过Gradio提供友好的Web界面&#xff0c;让用户…...

AI时代零代码开发指南:不懂编程的人该如何技术选型?

AI时代零代码开发指南&#xff1a;不懂编程的人该如何技术选型&#xff1f; 我们已经走进一个“说话就能写代码”的时代。2026年&#xff0c;AI编程工具已经成熟到可以让一个完全不懂代码的人&#xff0c;通过自然语言、拖拽和截图就构建出一款可用的软件。但选择变多&#xff…...

哔哩下载姬DownKyi:5分钟搞定B站视频下载的完整免费方案

哔哩下载姬DownKyi&#xff1a;5分钟搞定B站视频下载的完整免费方案 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&…...

QQ音乐加密文件终极解密指南:qmcdump让你的音乐重获自由 [特殊字符]

QQ音乐加密文件终极解密指南&#xff1a;qmcdump让你的音乐重获自由 &#x1f3b5; 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qm…...

告别画质与延迟的妥协:2026 高分 85 寸电视推荐及选购避坑要点

2026 年&#xff0c;85 寸大屏电视已经成为许多家庭客厅升级与娱乐中心的首选。特别是对于喜欢在客厅体验 3A 大作的主机玩家&#xff0c;或者追求极致沉浸感的影音爱好者来说&#xff0c;一台优秀的 85 寸电视能带来质的飞跃。但在实际选购中&#xff0c;很多朋友会陷入 “有画…...

芯片研发还在用瀑布模型,是守旧还是必要

软件行业流行敏捷开发已经二十年了&#xff0c;迭代快、反馈快、调整快&#xff0c;几乎成了现代软件工程的标配。芯片研发行业偏偏还在大量使用瀑布模型。瀑布模型的核心逻辑是&#xff1a;每个阶段完成&#xff0c;输出检查合格&#xff0c;才进入下一阶段。在芯片前端的研发…...

芯片工程师用 Vibe Coding 三个月后,我想说几句实话

很多人第一反应是&#xff1a;这不就是"凭感觉写代码"吗&#xff1f;听起来像是在开玩笑。但真正用过之后才会发现&#xff0c;这个理解完全反了。Vibe Coding 的核心&#xff0c;从来不是让开发者随便、凭感觉乱搞。恰恰相反——它要求开发者把那种最难被量化、最难…...

科目一通关攻略

本节内容是科目一速通攻略&#xff0c;欢迎各位同学学习&#xff0c;在学习过程中&#xff0c;可以参考下面的视频&#xff0c;祝愿同学们都可以取得满分&#xff01; 视频资料&#xff1a;https://www.bilibili.com/video/BV1Vj411t7ri?spm_id_from333.788.videopod.episode…...

手把手教你搞定Vivado第三方IP:从GitHub下载到成功导入的完整流程

手把手教你搞定Vivado第三方IP&#xff1a;从GitHub下载到成功导入的完整流程 在FPGA开发中&#xff0c;第三方IP核往往能为我们节省大量重复造轮子的时间。但实际操作中&#xff0c;从GitHub等平台获取的开源IP核常常会遇到文档不全、接口不匹配、集成报错等问题。本文将用一…...

Java17/21最新面试题大全

以下是根据您的要求整理的Java最新面试题大全&#xff08;基于当前主流版本如Java 17和Java 21&#xff09;&#xff0c;内容力求全网最全、最细&#xff0c;并附有简明答案。我基于Java官方文档、行业标准和常见面试实践原创整理&#xff0c;确保真实可靠。结构清晰&#xff0…...

字符缩到0.8mm板子丑到没法看!忽略的丝印美学

做 PCB 设计常陷入两难&#xff1a;为省空间把字符压到 0.8mm 以下&#xff0c;结果生产出来模糊、断线、边缘锯齿&#xff0c;整板杂乱廉价&#xff1b;刻意放大字符&#xff0c;又挤占布线空间、导致器件遮挡、拼板利用率下降。更头疼的是&#xff1a;同板字号忽大忽小、线宽…...

JianYingApi 终极指南:构建自动化视频处理流水线的完整解决方案

JianYingApi 终极指南&#xff1a;构建自动化视频处理流水线的完整解决方案 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi JianYingApi作为第三方剪映编程接口&#xff0c;为开发者和…...

《从函数到大模型速通》

一、从函数到神经网络所有一切的前提是&#xff0c;你要相信这个世界上的所有逻辑和知识&#xff0c;都可以用一个函数来表示。Functions describe the world !比如输入物体的质量和加速度&#xff0c;根据牛顿第二定律&#xff0c;就可以得到物体施加的力&#xff0c;这就是人…...

数据结构基础------初识二叉树

数据结构-------二叉树 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0)个有限结点组成一个具有层次关系的集合。我们把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是根朝上&#xff0c;叶在下。 特点: 1.有一个特殊的结点&#xff0c;称为根结…...

Java 25虚拟线程资源调度黄金参数表(2024 Q3压测实录:TPS提升3.8倍,P99延迟下降67ms)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Java 25虚拟线程资源调度优化全景概览 Java 25 正式将虚拟线程&#xff08;Virtual Threads&#xff09;从预览特性转为标准特性&#xff0c;并深度重构了ForkJoinPool与ThreadScheduler协同机制&#…...

别再用老方法了!用Python+OpenCV搞定Kinect V2相机标定的保姆级避坑指南

Kinect V2相机标定实战&#xff1a;PythonOpenCV避坑全攻略 刚拿到二手Kinect V2的开发者常会遇到各种环境配置和标定问题。市面上许多教程要么依赖过时的库版本&#xff0c;要么省略关键步骤&#xff0c;导致新手在标定过程中频频踩坑。本文将用最新工具链带你完整走通从环境配…...

【Docker WASM边缘部署终极指南】:20年架构师亲授5大高频报错根因与秒级修复方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker WASM边缘部署全景认知与技术栈演进 WebAssembly&#xff08;WASM&#xff09;正从浏览器沙箱走向云原生边缘场景&#xff0c;而 Docker 官方对 WASM 运行时的原生支持&#xff08;自 Docker Des…...

告别显存焦虑:用bitsandbytes的8位优化器,让你的RTX 3060也能跑大模型(保姆级配置)

用8位优化器释放RTX 3060潜力&#xff1a;低成本玩转LLaMA-7B全攻略 当你在Colab上看到"CUDA out of memory"的红色警告时&#xff0c;是否想过自己的RTX 3060其实也能跑动70亿参数的大模型&#xff1f;2023年柏林工业大学发布的实验数据显示&#xff0c;通过8位量化…...

第6篇:Java面向对象进阶:继承、重写与多态,解锁代码复用新姿势

上一篇我们掌握了Java面向对象基础&#xff0c;学会了定义类、创建对象&#xff0c;用封装保护数据安全&#xff0c;用构造方法简化对象初始化&#xff0c;完成了面向对象版的学生成绩管理案例。但在实际开发中&#xff0c;我们会遇到“多个类拥有相同属性和方法”的场景——比…...

K8s Pod 调度策略与优先级算法优化

Kubernetes作为容器编排领域的标杆&#xff0c;其Pod调度策略与优先级算法的优化直接影响集群资源利用率与应用稳定性。随着企业微服务规模扩大&#xff0c;如何让调度器更智能地平衡节点负载、保障关键业务&#xff0c;成为运维团队的核心挑战。本文将深入剖析调度优化关键技术…...

论文阅读:ICLR 2026 AlphaSteer: Learning Refusal Steering with Principled Null-Space Constraint

总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 https://openreview.net/forum?id1vvbzAqdTe ![ ICLR 2026 | 零空间安全操控 &#x1f4c4; 论文背景与基本信息 《AlphaSteer: Learning Refusal Steering…...

C 表达式中的汇编指令

asm 为 gcc 中的关键字&#xff0c;asm 表达式为在 C代码中嵌套汇编指令&#xff0c;该表达式只是单纯的替换出汇编代码&#xff0c;并不对汇编代码的含义进行解析。 asm 表达式有两种形式&#xff0c;第二种 asm-qualifiers 包含了 goto 语句。 第一种形式为常见的用法&#…...

如何永久免费使用IDM:开源激活脚本完整指南

如何永久免费使用IDM&#xff1a;开源激活脚本完整指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager&#xff08;IDM&#x…...

关于C++11的统一初始化语法示例详解

前言本文主要给大家介绍了C11统一初始化语法的相关内容&#xff0c;关于在当前新标准C11的语法看来&#xff0c;变量合法的初始化器有如下形式&#xff1a;1234X a1 {v};X a2 {v};X a3 v;X a4(v);其实&#xff0c;上面第一种和第二种初始化方式在本质上没有任何差别&#xff…...

Win11Debloat:免费Windows系统优化工具终极指南,轻松提升44%性能

Win11Debloat&#xff1a;免费Windows系统优化工具终极指南&#xff0c;轻松提升44%性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other change…...

云端还是本地?哪种RFID固定资产系统更合适你的企业?

在数字化转型的浪潮中&#xff0c;越来越多的企业认识到RFID固定资产管理系统的重要性。但当真正准备引进系统时&#xff0c;一个关键却绕不开的问题便摆在面前&#xff1a;到底该选云端还是本地部署&#xff1f;这不仅仅是技术路线的选择题&#xff0c;更关乎企业的成本结构、…...

Ostrakon-VL-8B数据预处理详解:餐饮图像清洗与标注规范

Ostrakon-VL-8B数据预处理详解&#xff1a;餐饮图像清洗与标注规范 如果你正在尝试训练或微调像Ostrakon-VL-8B这样的视觉语言模型&#xff0c;来让它更好地理解餐饮场景&#xff0c;那你肯定知道&#xff0c;数据质量是决定成败的关键。模型再强大&#xff0c;如果喂给它的是…...

推荐2款无需安装实用软件,桌面图标整理设置,简真是Windows神器!

聊一聊今天给大家推荐2款桌面美化小工具。为什么觉得要推荐这个小工具呢&#xff1f;因为最近帮一些人远程处理一些问题。感觉那电脑桌面&#xff0c;密密麻麻&#xff0c;全是小图标。我想找个东西都难&#xff0c;是太难了。我真恨不得上手整理。但又怕整理了&#xff0c;人家…...