c++21,22多肽

news2024/11/13 15:06:59

普通人买全价,学生半价 

多肽

构成条件

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.coloradmin.cn/o/1537132.html

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

相关文章

【C++】详解智能指针

目录 一、智能指针的作用二、内存泄露1、什么是内存泄露2、内存泄漏分类3、如何避免内存泄露 三、智能指针的使用及原理1、RAII2、智能指针的原理3、std::auto_ptr4、std::unique_ptr5、std::shared_ptr1、std::shared_ptr原理2、std::shared_ptr的线程安全问题4、std::shared_…

2024不起眼的“致富”野路子,不想打工了,做做这些暴利创业项目。2024个人创业做什么项目好;最适合白手起家的创业项目

经济大环境差,并不代表就没有机会。相反,主流经济不好正是另一些人所看重的千载难逢的机会。就像股票市场一样,有人靠做多赚钱,有人靠做空赚钱。下面我们就来分析一下哪些行业会在这个时候崛起。 首先二手行业会迅速崛起&#xff…

关闭Elasticsearch built-in security features are not enabled

禁用Kibana安全提示(Elasticsearch built-in security features are not enabled) Kibana提示#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.e…

【MySQL】MySQL用户管理

文章目录 一、用户1.用户信息2.创建用户3.删除用户4.修改用户密码 二、数据库的权限1.给用户授权2.回收权限 一、用户 如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 1.用户信息 我们安装mysql之后,会自动…

【Linux中vim系列】如何在vim中检索字符串

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

前端使用正则表达式进行校验

一、定义 设计思想是用一种描述性的语言定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。 在 JavaScript中,正则表达式也是对象,构建正则表达式有两种方式&#x…

DES加密原理及python脚本

一、加密 1、秘钥处理 ​ DES算法会先对64位密钥进行处理生成48位子密钥后再参与到算法的轮操作中,在每一轮的迭代过程中,使用不同的子密钥。其中的处理包括置换选择、循环左移、压缩置换。 1.1 置换选择 DES秘钥有64位,其中每8位有一个校…

✅技术社区—使用Redis BitMap实现签到与查询历史签到以及签到统计功能

一、前言 签到是一个很常见的功能,如果使用数据库实现,那么用户一次签到,就是一条记录,假如有100万用户,平均每个用户每年签到次数为30次,则这张表一年的数据量为 3000 万条,一般签到记录字段不…

Cubemx串口配置

1.时钟 2.引脚配置 3.重写printf代码 /* USER CODE BEGIN 1 */ int __io_putchar(int ch){HAL_UART_Transmit(&huart1,(uint8_t *) ch, 1,1000);return ch; } /* USER CODE END 1 */

conda 查看激活自己的新环境,labelImg的使用

查看环境目录 我们可以在基础环境中查看我们有几个环境 conda env list 激活新环境 我们激活pytorch环境pytorch conda activate pytorch 在新环境下安装 然后我们安装labelImg(Python3.10以上会报错) pip install labelImg 新环境下打开 labelImg …

将本地的项目上传到gitee,

场景:在本地有一个项目,想要把这个项目上传到gitee,且在gitee中已经创建好仓库 依次执行下图中的命令:

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日期滑动选择器弹窗)

根据指定的日期范围创建日期滑动选择器,展示在弹窗上。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用&…

Zama:链上隐私新标准

1. 引言 揭示 Web3 中全同态加密的潜在用例,并深入研究 Zama 的四种主要开源产品: TFHE-rsConcreteConcrete MLfhEVM 众所周知,在当今时代,数据隐私问题与互联网诞生以来一样普遍。仅 Yahoo!、Equifax 和 Marriott 的数据泄露就…

【C++ leetcode】双指针问题

1. 611. 有效三角形的个数 题目 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 题目链接 . - 力扣(LeetCode) 画图 和 文字 分析 判断是否是三角形要得到三边,由于遍历三边要套三层循环&#x…

C语言编译链接(个人笔记)

编译链接 程序的翻译环境和执行环境1.翻译环境2.运行环境 预处理1.预处理的符号2.宏和函数对比3.#undef4.条件编译4.1比较常见的条件编译指令 5.文件包含 笔试题 程序的翻译环境和执行环境 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执…

Cascaded Zoom-in Detector for High ResolutionAerial Images

代码地址 https://github.com/akhilpm/dronedetectron2 摘要 密集裁剪是一种广泛使用的方法来改进这种小物体检测,其中以高分辨率提取和处理拥挤的小物体区域。然而,这通常是通过添加其他可学习的组件来实现的,从而使标准检测过程中的训练和…

SpringBoot-04 | spring-boot-starter-logging原理原理

SpringBoot-04 | spring-boot-starter-logging原理原理 第一步:springboot加载factories文件第二步:构造监听器第三步:注册监听器到Spring中第四步:开始加载日志框架第五步:加载日志框架logback-spring.xml第六步&…

python矢量算法-三角形变化寻找对应点

1.算法需求描述 现有随机生成的两个三角形A与B,在三角形A中存在Pa,使用算法计算出三角形B中对应的点Pb 2.python代码 import numpy as np # 计算三角形A的面积 def area_triangle(vertices): return 0.5 * np.abs(np.dot(vertices[0] - vertices[…

人机交互三原则,网络7层和对应的设备、公钥私钥

人机交互三原则 heo Mandel提出了人机交互的三个黄金原则,它们强调了相似的设计目标,分别是: 简单总结为:控负持面–>空腹吃面 1,用户控制 2,减轻负担 3,保持界面一致 置用户于控制之下&a…

3新 IT 技术深刻变革,驱动实体经济进入智能化时代

技术进步和创新是实体经济转型升级的内生 源动力,是企业数字化转型的核心工具,有 助于“降本增效提质”目标的达成。自 20 世 纪 90 年代至今,我国快速完成信息化的大规 模建设,典型数字化技术已发展成熟并充分 融合进企业日…