C++中多态的底层实现

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.rhkb.cn/news/128875.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

健康系统练习

健康系统 项目建构: 前后端分离,前端vue3,后端Java,springboot做跨域处理,前端将在vscode中 的tomcat下部署,后端将在ideal中集成的tomcat中部署 创建项目工程在ideal中直接选用springi…创建&#xff0c…

创邻科技Galaxybase助力SPG推动知识图谱应用落地

1. 知识图谱实践应用:从理论到落地的全景视角 知识图谱,作为一种先进的数据模型和信息表示策略,极大地提升了信息检索与分析的能力。该模型利用图结构,将不同领域、层次和类别的信息有机整合,令复杂的数据关系变得清晰…

《得帆云 AIGC+低代码PaaS平台系列白皮书》-主流OA集成应用

近年来,随着国内外的信息技术发展日益迅速,无论是企业的业务模式,还是企业的人员管理,都在不断发展变化,OA系统作为公司的核心协调系统,必须能够及时响应公司的发展,实现与企业内部各种业务系统…

LeetCode刷题笔记【27】:贪心算法专题-5(无重叠区间、划分字母区间、合并区间)

文章目录 前置知识435. 无重叠区间题目描述参考<452. 用最少数量的箭引爆气球>, 间接求解直接求"重叠区间数量" 763.划分字母区间题目描述贪心 - 建立"最后一个当前字母"数组优化marker创建的过程 56. 合并区间题目描述解题思路代码① 如果有重合就合…

PostGreSQL:时间戳时区问题

时间|日期类型 PostGreSQL数据库内置的时间类型如下&#xff0c;注意到&#xff1a;内置的时间类型被分为了with time zone-带时区、without time zone-不带时区两种类型&#xff0c; time、timestamp和interval都可以接受一个可选的精度值 p&#xff08;取值&#xff1a;0-6&a…

hadoop伪分布模式配置

1、修改/usr/local/hadoop/etc/hadoop/core-site.xml和/usr/local/hadoop/etc/hadoop/hdfs-site.xml文件 core-site.xml内容 <configuration><property><name>hadoop.tmp.dir</name><value>file:/usr/local/hadoop/tmp</value><descr…

解释模块化开发及其优势,并介绍常用的模块化规范。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化开发⭐ 模块化开发的优势⭐ 常用的模块化规范⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是…

城市内涝监测预警系统:有效降低内涝风险,保障城市安全

近日&#xff0c;受台风“海葵”的影响&#xff0c;福建广东多地遭遇了持续性强降雨的袭击&#xff0c;道路积水严重&#xff0c;“城市看海”模式再次开启&#xff0c;不少网友纷纷调侃房子已经升级为海景房。近年来受极端天气影响&#xff0c;城市内涝灾害越发凸显&#xff0…

redis常用命令

redis客户端 // 连接远程的redis服务端 redis-cli -h host -p port -a password// 访问本机的redis服务端 redis-cli keys //以runoob*开头的key KEYS runoob*//查看全部的key KEYS * Type // type命令用于确定给定 key 存储的数据类型 type key Object /** 返回key的内…

【力扣每日一题】2023.9.10 课程表Ⅱ

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 今天的题目和昨天类似&#xff0c;不过今天要我们求出学习所有课程的先后顺序。 昨天只需要我们求出能否学习完所有课程&#xff0c;因此…

精品基于SpringCloud实现的电影院购票系统设计-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的电影院购票系统设计的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版…

计算机网络中的应用层和传输层(http/tcp)

目录 1、协议的通俗理解 1.1 理解协议 2.应用层 2.1 http协议 2.2 HTTP的方法 2.3 HTTP的状态码 2.4 HTTP常见Header 3、传输层 3.1 端口号 3.1.1 端口号范围划分 3.1.2 netstat 3.1.3 认识知名端口号(Well-Know Port Number) 3.2 UDP协议 3.2.1 UDP协议端格式 3…

[开学季]ChatPaper全流程教程

文章目录 1. 粗筛&#xff1a;论文全文总结1.1 使用步骤&#xff1a; 1.2 功能描述&#xff1a;2. 论文问答&#xff1a;2. 精读&#xff1a;学术版GPT的论文翻译2.0 论文精读的正确姿势2.1 使用场景1&#xff1a;arxiv论文完美翻译2.2 本地PDF全文翻译&#xff1a;2.3 关于免费…

【数据结构】线性表的知识点全面总结

目录 1.线性表的顺序表示 1.1顺序表的基本概念 1.2顺序表的基本操作 1.2.1插入 1.2.2删除 1.2.3查找 2.线性表的链式表示 2.1单链表 单链表的基本概念 2.1.1基本操作 2.1.1.1单链表的建立 2.1.1.2插入 2.1.1.3删除 2.1.1.4查找 2.2双链表 2.2.1基本操作 2.2.1.1插入 2.2.…

计算机专业毕业设计项目推荐03-Wiki系统设计与实现(JavaSpring+Vue+Mysql)

Wiki系统设计与实现&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设…

使用PHPStudy在本地快速建立网站并实现局域网外访问(无公网IP)

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…

探索GreatADM:如何快速定义监控

引文 在数据库运维过程中&#xff0c;所使用的运维管理平台是否存在这样的问题&#xff1a; 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固…

界面组件DevExpress WinForms v23.1 - 增强的图表、甘特图功能

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

《Python入门到精通》time模块详解,Python time标准库,time库函数大全

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 time模块详解 1、获取操作time.time() 获取时间戳(float)time.time_ns() 获取时间戳(int)time.thread_time()…