c++21,22多肽

普通人买全价,学生半价 

多肽

构成条件

1.虚函数重写

2.父类指针或者引用去调用虚函数

两个virtual没有关联

函数前面增加virtual虚函数,p是父类的引用,既可以传父类对象也可以传子类对象

去掉引用(子类传给父类,切片了) 不是多肽了

虚函数重写 (重载)

条件:

父子继承关系中的两个虚函数,三同 (函数名、参数,返回值)

virtual只能修饰成员函数

大坑->协变

三同 (函数名、参数,返回值)返回值有一个例外

协变->必须是父子类关系的    指针或者引用

幺蛾子

父类不可以不加virtual,子类(派生类)必须加virtual(可以理解成重写父类的实现)

总结:派生类可以不加virtual(建议加上,不加也不错 )

 派生类析构必须先子后父(自动)先父后子会出错

  

这里父类对象调用父类析构,但是子类对象也调用了父类析构(因为p有可能指向父类也可能是子类)因为子类的析构函数跟父类的析构函数形成隐藏关系

子类父类析构不是同名为什么构成隐藏?因为多 肽原因析构会被统一处理成 destructor,

这里delete p 调用的是p->destrutor()+operator delete(p),这里delete先调用destructor再调用operator delete(p),调用destructor时候是普通调用,普通调用调用看p类型,但是我们不希望是普通土调用,希望是多肽调用(指向父类调父类,指向子类调子类)

此时如果构成多肽,他的条件有

1.父类的指针或者引用去调用虚函数(满足了)

2.虚函数重写

父子继承关系中的:

1.两个虚函数

2.三同 (函数名、参数,返回值)参数的类型

这里返回值,参数都没有,只有函数名不同但是进行了特殊处理.

改成虚函数,次数就构成多肽了(就能正常析构了)

也就是说当析构函数是虚函数时,才能正确调用析构函数(否则可能内存泄漏)

为了防止子类virtual忘记写所以祖师爷就设置特例可以子类不写virtual就完成重写 

多肽调用

普通调用:调用函数的类型是谁,就是谁的调用函数(这个类型的函数)

多肽调用:调用的指针或者引用指向的对象,指向父类调用父类的函数,指向子类调用子类的函数

破坏多肽的调用条件

1.破坏继承关系(不继承了),不继承压根不能传参了

2.如果不是指针也不是引用吗,就是普通调用了,调用函数的类型是谁,就是谁的调用函数(这个类型的函数)

重写可以理解为继承了父类比如继承了一个函数并且 重写了这个函数

第一个ptr是父类的指针(或引用)调用的不是重写的虚函数

这样的危害就是,如果student没有什么资源还好,如有的话就没有进行清理,会造成内存泄漏

给析构函数加virtual后构成多肽(析构名称不同默认做特殊处理(相同)构成虚函数重写)

干脆派生类的析构也不用写了

总结:派生类(子类)函数和析构都不用加virtual了

继承下来是可以用,三同中参数看的是参数的类型

下面这道题

继承的是父类的接口,重写的是他的实现(用的是父类的接口1 )

 这里没有构成多肽,因为p不是父类的指针或者引用调用的

重载,覆盖(重写),隐藏(重定义)的对比

finial修饰 类,这个类不能被继承

 修饰 虚函数,这个虚函数就不能被重写 

 override

修饰子类的虚函数,检查是否完成重写,如果没有完成重写就报错

抽象类 

虚函数后面加 =0

纯虚函数:抽象类不能实例化对象(不存在父类对象/没有父类对象),(指针可以 Car*c)

抽象类他的子类也不能实例化对象(继承了父类),除非把这个纯虚函数进行重写,

 

多肽的另一种形态,父类是纯虚函数不存在父类对象

但是他有多个子类,多肽就运用到子类上,一定程度上说纯虚函数,强制(间接)子类去重写父类的纯虚函数 

抽象类,可以理解为不具有实体,不需要实例化

接口继承和实现继承

c++会把虚函数地址存到 虚函数表里面去,只要是虚函数就要多考虑一个指针

虚函数编译以后在内存会存到 代码段(指令都到代码段)

他是一个指针数组,里面存的指针,存的函数指针,虚函数指针数组

 多肽原理 

父类对象P

 子类对象s,他的虚表指针跟父类不是一个指针

虚函数的重写也叫(覆盖)他把父类的虚表拷贝过来,重写这两个被继承的虚函数,子类虚表被覆盖,覆盖成新的虚函数

 第二行fun地址没有变,说明只重写了虚函数buyticket(覆盖)

 多肽的原理是什么?,下面的vfptr是从子类中切割出来的父类然后访问BuyTicket

1.构成多肽,p是一个父类对象传给父类指针,就是说父类指针ptr指向父类对象p,从父类对象中找到虚函数表的地址,再拿到dc154300,ptr指向子类,从子类中切片出父类,从父类中找到虚函数表的地址也callc8154500(虚表不一样),所以就说明白了指向父类调父类。指向子类调子类

引用同理

对象不行,对象不能形成多肽 ,对象要拷贝过来,他不会拷贝把虚表指针拷贝下来,切割出子类对象中父类那一部分,成员会拷贝给父类对象ptr,但是不会把父类的虚函数指针拷贝下来

        如果假设父类对象=(赋值)子类对象会拷贝虚函数表指针

父类对象不能保证一定是父类虚表

 这样的话一个引用或者指针指向父类ptr就不能保证,指向父类调父类,指向子类调子类

这里*p=s,析构函数可能调错!子类对象赋值给父类p,因为析构函数也在虚表里面重写了,这时候p被覆盖成子类的虚表,析构时候调用子类的析构函数,这里竟然成了父类对象调用子类的虚函数!  ,

所以多肽的形成是父类的指针或引用(不能子类,因为父类不能给子类)也不能是对象直接拷贝,拷贝会形成问题

 

 如果子类不重写虚函数,父类和子类对象的虚表是否一样?

重写了肯定不一样,不重写也不一样(虽然可以一样但是编译器不允许,省去麻烦)

同类函数(对象p1,p2,p3,他们都是父类对象啊)虚表一样么?

一样(公用虚表)不同的类就不同

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

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

相关文章

云手机为电商提供五大出海优势

出海电商行业中,各大电商平台的账号安全是每一个电商运营者的重中之重,账号安全是第一生产力,也是店铺运营的基础。因此多平台多账号的防关联管理工具成了所有电商大卖家的必备工具。云手机最核心的优势就是账户安全体系,本文将对…

linux系统----------MySQL索引浅探索

目录 一、数据库索引介绍 二、索引的作用 索引的副作用 (缺点) 三、创建索引的原则依据 四、索引的分类和创建 4.1普通索引 4.1.1直接创建索引 4.1.2修改表方式创建 4.1.3创建表的时候指定索引 4.2唯一索引 4.2.1直接创建唯一索引 4.2.2修改表方式创建 4.2.3创建表…

Go语言hash库完全教程:从基础到高级应用

Go语言hash库完全教程:从基础到高级应用 简介hash库概览hash接口常用的哈希函数实现应用场景性能特点字符串哈希计算 使用hash库进行数据哈希文件哈希计算 hash库在数据校验中的应用使用SHA256进行文件完整性验证 hash库在安全加密中的应用生成安全的密码哈希使用HM…

cmd窗口运行jar程序,点击一下cmd窗口后java程序就暂停了

cmd窗口运行jar程序时,在cmd窗口点击了一下,如果你选中了(页面会有个白色的选中内容),java程序就会暂停,这是只有按一下鼠标右键或着CtrlC才能取消选中,程序才会继续运行,如果java程…

视频素材库哪家好?我给大家来分享

视频素材库哪家好?这是很多短视频创作者都会遇到的问题。别着急,今天我就来给大家介绍几个视频素材库哪家好的推荐,让你的视频创作更加轻松有趣! 视频素材库哪家好的首选当然是蛙学网啦!这里有大量的高质量视频素材&am…

学成在线_视频处理_视频转码不成功

问题 当我们用xxljob进行视频处理中的转码操作时会发现视频转码不成功。即程序会进入下图所示的if语句内。 问题原因 在进行视频转码时程序会调用Mp4VideoUtil类下的 generateMp4方法,而result接收的正是该方法的返回值。那么什么时候generateMp4方法的返回值会…

基于转录组计算的肿瘤纯度与病理肿瘤纯度一致性差异

实体瘤组织由肿瘤和非肿瘤细胞组成,如基质细胞和免疫细胞。这些非肿瘤细胞构成肿瘤微环境(TME)的重要组成部分,可降低肿瘤纯度,并在癌变、恶性肿瘤进展、治疗耐药性和预后评估中发挥重要作用。 肿瘤间质比的预后影响 …

【数据结构】直接插入排序

大家好,我是苏貝,本篇博客带大家了解插入排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 基本思想二. 插入排序详解(以升序为例)三. 对比冒泡排序 一. 基本…

Mysql数据库的SQL语言详解

目录 一、数据库的基础操作 1、数据库的基本查看和切换 1.1 查看数据库信息 1.2 切换数据库 1.3 查看数据库中的表信息 1.4 查看数据库或数据库中表的结构(字段) 1.5 数据类型 1.5.1 整数型 1.5.2 浮点型(float和double) 1.5.3 定点数 1.5.4…

134. 加油站(力扣LeetCode)

文章目录 134. 加油站暴力枚举(超时)代码一代码二(优化) 贪心算法方法一方法二 134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加…

ng发布静态资源 发布项目 发布数据

描述:把一个项目或者数据发布出来,通过http的形式访问,比如发布一个js文件,用http://localhost:6060/data/jquery/jquery.min.js访问。 步骤:配置nginx.conf文件,nginx.conf位于conf目录下,在se…

ROS机器人虚拟仿真挑战赛本地电脑环境配置测试

预备基础 此案例需要完成: ROS机器人虚拟仿真挑战赛本地电脑环境配置记录-CSDN博客 ROS机器人虚拟仿真挑战赛本地电脑环境配置个人问题汇总-CSDN博客 命令测试 在不同的终端窗口分别输入: 标签1: roslaunch tianracer_gazebo demo_tian…

分享|大数据信用风险测评多久做一次比较好?

大数据信用风险测评多久做一次比较好?对于个人大数据信用风险测评,一般来说,多久做一次并没有固定的时间间隔。这取决于许多因素,包括个人信用状况、数据更新频率、个人需求等等。 首先,个人的信用状况是决定测评频率的一个重要因…

成都百洲文化传媒有限公司电商新浪潮的领航者

在当今电商行业风起云涌的时代,成都百洲文化传媒有限公司以其独特的视角和专业的服务,成为了众多商家争相合作的伙伴。今天,就让我们一起走进百洲文化的世界,探索其背后的成功密码。 一、百洲文化的崛起之路 成都百洲文化传媒有限…

各类主流电商API商品采集接口的权限控制和功能权限控制

主流电商平台的API接口类型 参数说明 通用参数说明 url说明 /平台/API类型/ 平台:淘宝,京东等, API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,测试key:test_api_keysecret:调用secret,测试secret:(不用填写…

Unity定时播放音乐

一、需求 需要定时在早上8:50,中午12:00,下午13:10定时播放音乐 二、实现步骤 依次在unity创建背景图、主文字提示、时间文字提示、音量控制器及音量文字提示、退出按钮、播放按钮,暂停按钮 在Canvas下创建一个Script脚本:获取…

【光标精灵】让您享受鼠标皮肤多样化快捷更换

鼠标作为我们日常使用频率最高的“小伙伴”,扮演着至关重要的角色。尤其是在女生群体中,对于打造一个个性化、可爱的电脑桌面和软件界面的需求日益增长。然而,尽管电脑默认提供了一些可更换的光标图案,但仍显得有些单调和呆板。想…

从Spring进化为SpringBoot

目录 零.SpringBootApplication 一.起步依赖 二.自动配置 三.自动配置的原理 1.装配常见方案 【1】方案1:ComponentScan 组件扫描 【2】方案2:Import 导入 【3】使用第三方依赖提供的 EnableXxxxx注解 2.自动装配原理 3.实现starter 四.内置T…

虚拟直播赋能文旅,蓝海创意云亮相文旅虚拟现实应用推广交流活动

3月21日,由文化和旅游部产业发展司主办,中国信息通信研究院、北京市石景山区文化和旅游局、中国动漫集团有限公司承办的文化和旅游虚拟现实应用推广交流活动在首钢一高炉SoReal科幻乐园33 Meta Club举办。蓝海创意云应邀参与此次活动,携vLive…

MySQL索引的创建与基本用法

文章目录 MySQL索引MySQL索引的类型与创建方法基础索引 唯一索引**唯一索引的创建** ******注意唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。*** ***主键索引组合索引**…