C++中多态的底层实现

news2025/1/20 18:25:51

1.先来看一波比较容易出错的题

会打印出来什么?

其实打印出来的是B->1;为什么呢?看我如何讲解的。

2.思考为什么只有引用或则指针才能触发多态

结论:子类赋值给父类对象切片,不会拷贝虚标

我听老师上面的解释是:如果拷贝虚表,那么父类对象虚表中是父类还是子类就不确定了。

但是我感觉有点晦涩,可能的能力还不够,我的理解就是,赋值本来就是一种重新创建一个新的对象,类型是不会变的,能强转就强转,不能就报错。但是引用和指针就不一样了,他传的是地址,那自然而然的虚表就会转过去,为什么呢?因为vfpter的地址就在类里面啊。看下面就会理解了,因为下面就要讲地址了。

3.虚标是存在内存的哪一个段中?

1.栈,堆,静态区(数据段),常量区(代码段)

首先我们要增加一个知识点:就是上面的A类在内存中是如何存储的;

很多书上写的是静态区,但是我实验了一下,应该是在常量区的,可以跟着我实验一下子,然后你自行判断。

我想一个相同的段,他们之间相差的地址应该不会太大的,所以我由此判断,他应该是存储在常量区的。

4.子类添加一个虚函数,但是虚标中没有添加是为什么?

1.首先  要增加的一个知识点就是,在vs编译器环境下,虚表的最后会用0来表示结尾,各个编译器不一样,g++好像就不是的,所以别把这种当成一定是这样的。

2.现在我们再来看标题上的问题:

因此,我们可以用一些特殊的办法来打印出来,验证一下我们这个想法:

5.多继承的派生类中重写的虚函数地址为什么不一样?

1.他们调用得是同一个函数,难道编译器写了两份函数吗?其实没有必要,所以我们又要从内存下手了啊。

但是我们调到了地址,依旧没有我们想要的答案,感觉这个内存有点杂乱无章了,不清楚应该干嘛了,那么其实我们可以取汇编看一下情况,或许就能有所头目。

由此可见,他Base2经历了一段操作,调到了同一个函数里面,但是有没有想过为什么呢?

看一眼这一步就会发现,sub是减去的意思,相当于把ecx减去了8,那ecx是什么呢?其实是存this指针的地方,我们调用的fun1是不是用的是Derive的this指针,所以要让this指针减去一个Base2的大小(8== 函数地址4加上成员变量b2  4字节)

但是我加了一个Base类,按道理他应该在调用第一个也会ecx减去然后指向Base也就是Derive这个类的this指针,但是他没有,所以我有充分的理由怀疑会不会寻找的就是最上面题目上讲的,找到是最基类虚函数的声明那一段。

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

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

相关文章

敏捷工具敏捷项目管理实践管理

​Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。 Leangoo领歌是一款永久免费的专业敏捷研发管理工具,提供敏捷研发解决方案,解决研发痛点,打造成功…

STM32低功耗分析

1.ARM发布最新内核 2023 年5 月 29 日,Arm 公司今天发布了处理器核心:Cortex-X4、Cortex-A720 和Cortex-A520。这些核心都是基于 Arm v9.2 架构,只支持 64 位指令集,不再兼容 32 位应用。Arm 公司表示,这些核心在性能…

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布,后来成为了一个独立的开源项目,并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据,并提供强大的查询语言PromQL来…

Python 之使用Numpy库来加载Numpy(.npy)文件并检查其内容

文章目录 总的介绍data.dtypedata.shapedata.ndimdata.size 总的介绍 要判断一个Numpy(.npy)文件的数据集类型,你可以使用Python中的Numpy库来加载该文件并检查其内容。以下是一些常见的步骤: 导入Numpy库: 首先&…

【关于存储故障的维修心得】

工具 分享:傲梅分区助手 和 DiskGenius https://www.diskgenius.cn/ https://www.disktool.cn/download.html 傲梅 1,想要不改变文件的情况下,改变某些盘的大小,如C盘,Win11有概率磁盘管理 工具不能压缩卷 扩展卷。…

Idea中如何在一个项目中引入其他子模块?

首先在Settings打开Project Structure,然后找到Modules,点击加号点击import module,将需要引进的module引进来。 然后点击Artifacts 可以看到比如说day22…这个是我现在的项目,day16是我需要引入的。那么就在红色横线上面右键点第…

第六章 图 五、图的深度优先遍历(DFS算法)

目录 一、定义 深度优先遍历通常用于解决以下问题: 深度优先遍历算法具有以下优点: 深度优先遍历算法的一个缺点是: 二、代码 空间复杂度: 时间复杂度: 邻接矩阵存储: 邻接表存储: 三、…

[Qt]基础数据类型和信号槽

文章目录 1. Qt基本结构1.1 Qt本有项目1.1.1 项目文件(.pro)1.1.2 main.cpp1.1.3 mainwindow.ui1.1.4 mainwindow.h1.1.5 mainwindow.cpp 1.2 Qt中的窗口类1.2.1基础窗口类1.2.2 窗口的显示 1.3 内存回收 2. Qt中的基础数据类型2.1 基础类型2.2 log输出2…

用postman 推送消息到GCP的pubsub

创建1个Topic 和 2个 subscription 我们可以用terraform 去创建1个topic 和 2个subscriptions # topic resource "google_pubsub_topic" "topic_a" {name "TopicA"project var.project_id }# subscriptions resource "google_pubsub_s…

C++环境配置(MinGW下载)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Tomcat配置域名和端口

Tomcat配置域名和端口 1.进入tomcat文件夹2. cd 到你的tomcat下3. 修改server.xml文件中监听端口4. 重启tomcat 1.进入tomcat文件夹 2. cd 到你的tomcat下 3. 修改server.xml文件中监听端口 继续修改server.xml中Host 4. 重启tomcat 进入bin ./shutdown.sh ./startup.sh …

Hilbert-Schmidt Operator

Hilbert-Schmidt Operator See https://mathworld.wolfram.com/Hilbert-SchmidtOperator.html See https://people.kth.se/~laptev/FA08/l8.pdf

Spring Boot集成JasperReport生成文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档。 一、使用Ireport designer 5.6设计模板 ireport的使用由于时间关系不便多…

php-fpm未授权访问漏洞

目录 一、产生原因 二、利用条件 三、过程原理 四、复现过程 一、产生原因 php-fpm配置不当,fastcgi_pass这里配置了0.0.0.0,将fastcgi接口暴露在公网,任何人都可以利用接口对php-fpm发送fastcgi协议数据,更改php.ini配置文件…

Vue3-devtools开发者工具安装方法

因为最近在学习Vue3,但是之前找到的Vue3-Devtools失效了,那就来下载安装下 下载安装 Github下载地址:Vue3-Devtools 这个链接快点:Vue3-Devtools 点击链接后页面如下 点击main选项,下拉列表往下拉,找到你想要的版…

谁在为网络安全制造标尺?

“我们想帮助企业往后退一步,去全局的看一下自己的安全能力建设水平如何,以及在当下的阶段最应该做的安全建设是什么? ” 度量,对应的是更清晰的认知。而对企业安全而言,这种认知,也更在成为一把新的标尺…

UMA 2 - Unity Multipurpose Avatar☀️八.UMA内置实用Recipes插件

文章目录 🟥 UMA内置Recipes位置🟧 CapsuleCollider🟨 Expressions : 表情管理(重点)🟩 Locomotion : 移动测试的插件🟦 Physics : Collider升级版🟥 UMA内置Recipes位置 如下图所示,UMA共内置5种实用Recipes,文件夹内的Text Recipes类型的文件即是实用Recipes. …

nbcio-boot移植到若依ruoyi-nbcio平台里一formdesigner部分(一)

nbcio-boot项目移植到ruoyi-nbcio项目中, 今天主要讲formdesigner的移植 1、把formdesigner的源代码拷贝到component里,并修改成formdesigner,如下: 2、form下的index.vue修改如下: 主要是修改新增,修改…

【excel】万字长文,一些实用excel技巧,金融财务行业巨实用(最后有干货,配合chatgpt让你成为excel大佬)

本文主要记录一些在工作中经常能用到的excel技巧,能够帮助我们提高工作效率。在文章的最后还会通过几个实战例子来加深大家的理解。建议把本文作为备查文,不需要在阅读本文的当下就将这些技巧掌握,只需了解,哪些东西通过excel是能…

ADS中带通滤波器模型参数含义学习笔记

ADS中带通滤波器模型参数含义 1、 Fcenter 中心频率 2、 BWpass 通带带宽 3、 Apass 衰减量时的通带带宽 这两个是对应的,比如说是80MHz,3dB,那么就是3dB时的带宽为80MHz,如果改为0.1dB,那么带宽就是0.1dB时的带宽为80…