虚函数+多态实现原理(一个冷门知识)

news2024/12/23 22:13:33

目录

多态实现

虚函数定义

先说原理

抛出问题

探究多态底层

冷门知识


多形态的大海

多态实现

完成类多态体现,多态两个条件:
虚函数重写
父类指针或者引用去调用虚函数。

虚函数定义

虚函数重写/覆盖条件 : 函数 + 三同 (函数名、参数、返回值)
不符合重写,就是隐藏关系
特例1: 子类虚函数不加virtual,依旧构成重写(实际最好加上)

特例2:重写的协变。返回值可以不同,要求必须时交子关系的的指针或者引用(极易报错)

为什么呢?明明是father类引用呀。

先说原理

因为对象虚函数表的不同,基类的引用/指针其实指向的是子类的虚表,就好像基类函数给覆盖重写一样。

抛出问题

先写俩类。

class father
{
public:
	virtual void func1() 
	{
		printf("father printf\n");
	}
	virtual void no_vir()
	{}

protected:
	const char* _father_val = "fathar";
};

class son : public father
{
public:
	virtual void func1()
	{
		printf("son printf\n");

	}
protected:
	const char* _son_val = "son";
};

 这究竟是什么原因呢????

探究多态底层

进入调试模式查看father实例化对象parent里有啥。 

_father_val我们知道是成员变量,这_vfptr是什么?

他是一个数组指针指向一个指针数组。这数组保存的是函数地址。这奇奇怪怪的什么情况看看parent的大小

这个二级指针属于这对象中。

看看child对象有什么。

自己_son_vals数据+ 父类继承虚表与父类_father_val.让我们对比一下,parent与child的虚表

 首先vfptr虚表的地址不一样,说明了我们的child与parent对象的虚表是相互独立的,看看各自指向的数组,发现[1]保存的地址数据相同,而[0]的地址数据保存的不同。好关键的来啦

 

将parent对象与child对象都传入test函数。发现调用的函数不同。其实就是应为这的引用与指针调用函数其实是根据虚表的函数地址调用。

画图画图!

 其实所谓的多态其实就是指针或者引用访问的时候派生类中继承基类虚表是,检测自己的函数是否可以重写基类虚函数,可以的话就会改变自己基类中虚表中该函数地址的值,改变为自己函数的地址。


冷门知识

我们的函数替换的时候其实保存的依旧是基类的函数接口。俗话讲:头还在换了个身体。因为在汇编中我们可以知道函数调用call前先需要,将实参压栈(如果写了缺省值就缺省压栈),然后再去调用call函数地址。

运行代码

 重写替换了函数体内代码,但是函数头还是基类的头!!

如果有人这样考你,他一定是一个老六!!

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【板栗糖GIS】——如何使用插件将微信读书笔记同步到notion

【板栗糖GIS】——如何使用插件将微信读书笔记同步到notion 注:本文创意以及插件开发皆是B站的【三此君】 视频链接如下: 全网唯一支持图文导出的微信读书插件,升级啦!主打一个惊艳。_哔哩哔哩_bilibili ,我只是记录…

阿里内部人手一份的Spring Cloud Alibaba手册

“微服务架构经验你有吗?” 前段时间一个朋友去面试,阿里面试官一句话问倒了他。实际上,不在 BAT 这样的大厂工作,是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得,让各个大厂都抢着要这样的人才&…

linux(信号结尾)

目录: 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…

【数据结构】图的遍历、图的应用

以下是对王道数据结构图的部分选择题的纠错 图的遍历 对于一个非连通无向图G,采用DFS访问所有顶点,在DFSTraverse函数中调用DFS的次数正好等于连通分量个数 一次遍历必然会将一个连通图中的所有顶点都访问到,对于已被访问的顶点不在调用DFS&…

APP测试中ios和Android的区别是什么~

01、常识性区别 02、导航方式 iOS:Tab放在页面底部,不能通过滑动来切换,只能点击。也有放在上面的,也不能滑动,但有些Tab本身可以滑动,比如天猫的。还有新闻类的应用。 Android:一般放在页面…

数据库实验五 函数

任务描述 本关任务:对表达式取整 相关知识 四舍五入的函数 ROUND(X,D) 返回X,其值保留到小数点后D位,而第D位的保留方式为四舍五入。 若D的值为0,则对小数部分四舍五入。 若将D设为负值,保留X值小数点左边的D位 TRUNCATE(X,D)…

《剑指 Offer--LeetCode 学习计划》-- 字符串

剑指 Offer 05. 替换空格&#xff08;Easy&#xff09; 题目描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。限制&#xff1a;0 < s 的长度 < 10000。 举例说明 示例 1&#xff1a; 输入&#xff1a;s “We are happy.”。输出&…

K210图像检测(1~8)数字卡片识别

前言 第一次使用该平台。想先找一个简单的识别&#xff0c;来走走流程。就想到了&#xff0c;前几年的送药小车的数字卡片识别。花了半天收集标记图片。在运行时要注意摄像头与数字卡片的高度。不过也有些不足&#xff0c;可能是收集某个数字的训练集的时候&#xff0c;拍摄高度…

文件智能归类,让文件分类变得简单易行

在数字化信息时代&#xff0c;我们经常需要处理各种类型的文件&#xff0c;如文档、图片、视频等&#xff0c;而这些文件可能存在于不同的文件夹、不同的磁盘之间&#xff0c;管理起来十分繁琐。为了解决这个问题&#xff0c;文件智能归类管理应运而生。这种文件管理方式采用智…

公司新招了几个00后,我愿称之为卷王之王

前几天我们公司一下子也来了几个新人&#xff0c;这些年轻人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年秋招就要开始了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&a…

水中声源级SL的求解应用举例

水中声源级SL的求解应用举例 在水声学中&#xff0c;经常会遇到声源级的概念&#xff0c;并根据声源级的大小估计其他重要参数&#xff0c;本文举例说明声源级的概念和定义。 一、声源级的定义 声源级用来描述声音辐射源所产生声信号或噪声在1m距离处的声强量级。其定义为 S …

安卓大作业 书籍列表APP

系列文章 安卓大作业 书籍列表APP 文章目录 系列文章1&#xff0e;背景2&#xff0e;功能3. 源代码获取 1&#xff0e;背景 我做的项目是一个可以查看到书籍列表以及详情效果的内容&#xff0c;主要使用到的技术有Intent数据传递以及数据库存储的应用&#xff0c;其次使用的组…

【笔试强训选择题】Day23.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

【编译、链接、装载四】汇编知识补充——ATT 汇编语法、寄存器、指令、栈、栈帧

【编译和链接四】编译器后端——生成汇编代码 一、AT&T 汇编语法1、Intel 汇编2、AT&T汇编 二、x86寄存器1、x86通用寄存器2&#xff0e;其他寄存器3、寄存器的具体用途 三、常见的x86指令四、栈和栈帧 一、AT&T 汇编语法 AT&T VS Intel 基于 x86 架构 的处理…

PyCaret初学者指南

&#x1f680;分类 PyCaret的分类模块是一个监督机器学习模块&#xff0c;用于将元素分类到组中。 目标是预测离散和无序的类别标签。一些常见的用例包括预测客户违约&#xff08;是或否&#xff09;、预测客户流失&#xff08;客户将离开或留下&#xff09;、发现疾病&#x…

深入理解深度学习——注意力机制(Attention Mechanism):基础知识

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

『DevOps』如何使用 Webhook 在 Jenkins 项目中实现自动构建

&#x1f4e3;读完这篇文章里你能收获到 全文采用图文形式讲解在Jenkins配置Webhook实现代码推送时Jenkins自动构建感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录 一、插件安装及配置1. 安装Generic Webhook Trigger Plugin2. 配置Webhook接收器 二、代码托管平台设置1. …

从新手到专家——我对于计算机科学专业的经验分享

在我的计算机科学专业学习之旅中&#xff0c;我遇到了无数的难题和挑战&#xff0c;但也因此积累了许多宝贵的经验。今天&#xff0c;我想要分享我在这个领域中的经验和看法&#xff0c;希望能够对即将进入计算机科学专业的后辈们有所帮助。 坚持动手实践 计算机科学是一个实…

Python调试串口设备Ortec 974A

Ortec 974A四通道100HMz计时/计数器的介绍在以下连接中&#xff1a; O​​​​​​​Ortec -- 974A 四通道100-MHz计时器/计数器_yuyuyuliang00的博客-CSDN博客 1、调试准备工作 1&#xff09;一个串口服务器 根据Ortec 974A的串行通信参数&#xff0c;对串口服务器进行设…

【手撕MyBatis源码】MyBatis映射体系

文章目录 映射工具MetaObject基本功能底层结构获取属性值的流程 ResultMap结果集映射手动映射自动映射 嵌套子查询循环依赖懒加载原理内部结构Bean代理过程 联合查询和嵌套映射映射说明联合查询1对1查询映射1对多查询RowKey创建机制结果集解析流程 映射工具MetaObject 所谓映射…