在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一.多态概念
同样是动物叫的⼀个⾏为(函数),传猫对象过去,就是”(>ω<)喵“,传狗对象过去,就是"汪汪"。
1.根据对象不同类型,调用不同函数,这就叫做运行时多态(动态多态)
2.编译时多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态

———————————————————————————————

二.实现多态还有两个必须重要条件:
• 必须是通过基类的指针或者引⽤调⽤虚函数
• 被调⽤的函数必须是虚函数,并且完成了虚函数重写/覆盖。
原因分析:多态实现必须条件分析

———————————————————————————————
三.重写/覆盖
1.重写意味这,通过对父类成员虚函数的声明,然后重新写函数实现(声明采用基类,实现采用自己写的)
2.函数名,参数,返回值相同
3.由于派生类重写时的声明采用的是,基类成员虚函数的声明因此,在基类中已经写过virtual在成员函数前,派生类成员函数不用再写virtual,不过建议写上

———————————————————————————————

四.静态/动态多态
1.编译时多态(静态多态),函数重载和函数模板,编译时传入参数匹配,生成函数
2.运行时多态(动态多态),编译阶段无法知道,实际调用哪个版本的函数是在运行时根据对象的实际类型决定的

———————————————————————————————

五.析构函数的重写
基类的析构函数为虚函数,此时派⽣类析构函数只要定义(看上面重写分析),⽆论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了vialtual修饰,派⽣类的析构函数就构成重写。

delete的原理delete详解剖析

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间
class A
{public:virtual ~A(){cout << "~A()" << endl;}
};
class B : public A 
{public:~B(){cout << "~B()->delete:"<<_p<< endl;delete _p;}
protected:
int* _p = new int[10];
};
// 只有派⽣类Student的析构函数重写了Person的析构函数,下⾯的delete对象调⽤析构函数,才能
//构成多态,才能保证p1和p2指向的对象正确的调⽤析构函数。
int main()
{A* p1 = new A;A* p2 = new B;delete p1;delete p2;return 0;
}

上面的代码我们可以看到,如果~A(),不加virtual,那么delete p2时只调⽤的A的析构函数,没有调用B的析构函数,就会导致内存泄漏问题,因为~B()中在释放资源。

注意:这个问题⾯试中经常考察,⼤家⼀定要结合类似下⾯的样例才能讲清楚,为什么基类中的析构函数建议设计为虚函数。

———————————————————————————————

六.重载 重写/覆盖 隐藏 三个概念的对比辨析

在这里插入图片描述

———————————————————————————————

七.纯虚函数和抽象类

在虚函数声明时在函数签名末尾添加 = 0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被派⽣类重写,但是语法上可以实现),只要声明即可包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派⽣类继承后不重写纯虚函数,那么派⽣类也是抽象类纯虚函数某种程度上强制了派⽣类重写虚函数,因为不重写实例化不出对象

抽象类就类似,car和各种具体车的品牌,car作为抽象类 ,Benz和BMW作为派生类

———————————————————————————————

八.多态底层原理 多态实现必须条件分析
在这里插入图片描述

对不满⾜多态条件(指针或者引⽤+调⽤虚函数)的函数调⽤是在编译时绑定,也就是编译时确定调⽤函数的地址,叫做静态绑定。
• 满⾜多态条件的函数调⽤是在运⾏时绑定,也就是在运⾏时到指向对象的虚函数表中找到调⽤函数的地址,也就做动态绑定。

虚函数表

• 基类对象的虚函数表中存放基类所有虚函数的地址。同类型的对象共⽤同⼀张虚表,不同类型的对象各⾃有独⽴的虚表,所以基类和派⽣类有各⾃独⽴的虚表。
• 派⽣类由两部分构成,继承下来的基类和⾃⼰的成员,⼀般情况下,继承下来的基类中有虚函数表指针,⾃⼰就不会再⽣成虚函数表指针。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个就像基类对象的成员和派⽣类对象中的基类对象成员也独⽴的
派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。
• 派⽣类的虚函数表中包含,(1)基类的虚函数地址(2)派⽣类重写的虚函数地址完成覆盖,派⽣类⾃⼰的虚函数地址三个部分。
• 虚函数表本质是⼀个存虚函数指针的指针数组,⼀般情况这个数组最后⾯放了⼀个0x00000000标记。(这个C++并没有进⾏规定,各个编译器⾃⾏定义的,vs系列编译器会再后⾯放个0x00000000标记,g++系列编译不会放)
虚函数存在哪的?虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的,只是虚函数的地址⼜存到了虚表中。
• 虚函数表存在哪的?这个问题严格说并没有标准答案C++标准并没有规定,我们写下⾯的代码可以对⽐验证⼀下。vs下是存在代码段(常量区)

注意:同类型对象共有同一张虚函数表

———————————————————————————————

八.指针数组/数组指针
1.指针数组:void (*pf)()
2.数组指针:int (*pa)[10]

——————————————————————————————
九.
派生类对象析构时会自动在结束时自动增加析构基类部分,目的是保证先子后父
在这里插入图片描述

——————————————————————————————

继承

一.让一个类不能被继承
1.构造函数私有化(派生类在构造时调用不到基类构造函数)
2.关键字final class Base final{ };

二.
1.友元关系不能继承
2.虚继承(虚继承(Virtual Inheritance)是C++中处理多重继承时避免二义性问题的一种机制,特别是当一个类从多个基类继承,而这些基类又有一个共同的基类时。通过使用虚继承,可以确保共同基类的成员在派生类中只有一个副本,从而避免了重复继承带来的数据冗余和访问冲突.)

三.继承语法

在这里插入图片描述
四.切片特性
public继承的派⽣类对象 可以赋值给 基类的指针 / 基类的引⽤。这⾥有个形象的说法叫切⽚或者切割。寓意把派⽣类中基类那部分切出来,基类指针或引⽤指向的是派⽣类中切出来的基类那部分。
在这里插入图片描述
五.隐藏

  1. 在继承体系中基类和派⽣类都有独⽴的作⽤域。
  2. 派⽣类和基类中有同名成员,派⽣类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。(在派⽣类成员函数中,可以使⽤ 基类::基类成员 显⽰访问)
  3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
  4. 注意在实际中在继承体系⾥⾯最好不要定义同名的成员。

在这里插入图片描述

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

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

相关文章

SpringAI+MCPServer+MCPClient快速入门

SpringAI MCPServer MCPClient 快速入门编写大纲 源代码地址&#xff1a;https://download.csdn.net/download/user_admin_god/90926893 1. 介绍 本文通过使用免费的智普AI的glm-4-flash模型&#xff0c;设计并实现了一个智能问答系统。在该系统中&#xff0c;我们编写了一…

Linux `vi/vim` 编辑器深度解析与高阶应用指南

Linux `vi/vim` 编辑器深度解析与高阶应用指南 一、核心功能解析1. 模式系统2. 与主流编辑器对比二、核心操作体系1. 高效导航命令2. 文本操作矩阵三、高阶配置体系1. .vimrc 配置示例2. 插件管理系统四、企业级开发实践1. 代码编辑技巧2. 宏录制与批量处理五、可视化与多窗口1…

Java五种方法批量处理List元素全解

Java:如何优雅批量处理List中的每个元素 一、场景分析&#xff1a;为什么需要批量处理List&#xff1f;二、核心方法&#xff1a;五种实现方式对比2.1 普通for循环&#xff08;最直接的方式&#xff09;代码示例&#xff1a;优缺点&#xff1a; 2.2 Java 8 replaceAll&#xff…

【Elasticsearch】`_refresh`和`_flush`的区别

在Elasticsearch中&#xff0c;_refresh和_flush操作虽然看似都与“刷新”有关&#xff0c;但它们的功能和作用范围有显著区别&#xff1a; _refresh操作 - 目的&#xff1a;使索引操作&#xff08;如新增、更新、删除文档&#xff09;后的更改能够立即被搜索到。 - 工作原理…

Java核心数据类型:String深度解析(JDK 8+)

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 问题驱动&#xff1a;从用户注册场景说起 场景描述&#xff1a;开发一个用户注册功能时&#xff0c;需要处理用户名的校验、格式化和存储。你可能会遇到…

人员睡岗检测算法AI智能分析网关V4打造工业/安防/交通等多场景应用方案

一、引言​ 在工业生产、安防监控等多领域&#xff0c;众多岗位需员工长时间值守&#xff0c;如流水线工人、监控值班员等。但高强度工作易引发睡岗问题&#xff0c;导致生产效率下降&#xff0c;甚至造成安全事故与财产损失。传统人工巡检响应慢、成本高&#xff0c;难以满足…

自动生成提示技术突破:AUTOPROMPT重塑语言模型应用

AUTOPROMPT 预训练语言模型的显著成功促使人们研究这些模型在预训练期间学习了哪些类型的知识。将任务重新表述为填空题(例如,完形填空测试)是衡量此类知识的自然方法 但是,它的使用受到编写合适提示所需的手动工作和猜测的限制。为了解决这个问题,我们开发了 AUTOPROMP…

6个月Python学习计划 Day 7 - 复盘 + 测试日

第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典&#xff08;dict&#xff09;与集合&#xff08;set&#xff09; Day 6 - 综合实战&#xff1a;学生信息…

Pycharm and Flask 的学习心得(9)

request对象&#xff1a; 1. request包含前端发送过来的所有请求数据 将from表单里的内容CV到request里面&#xff0c;可以添加if语句来做判断出请求类型后的操作 在网页上的表单上input的数据&#xff0c;后端如何获取呢&#xff1f; request对象获取前端发送来的数据 // …

设计模式-依赖倒转原则

依赖倒转原则 依赖倒转原则 (Dependency Inversion Principle, DIP) 是面向对象设计中 SOLID 原则的第五个原则。 它包含两条核心思想&#xff1a; 高层模块不应该依赖于低层模块。两者都应该依赖于抽象。 高层模块 (High-level modules): 通常包含复杂的业务逻辑和策略&…

AI赋能引爆短剧全球化风潮,腾讯云媒体处理助力短剧平台出海吸金

2023年&#xff0c;中国短剧市场以全平台8000万日投放、近500亿规模的爆发式增长震惊行业。紧凑的内容、爽快的剧情令国内观众迅速爱上了几分钟一集的微短剧。然而在平台内卷、监管收紧、巨头入场等因素的冲击下&#xff0c;不到两年时间&#xff0c;这条赛道就已陷入红海。但与…

开源第三方库发展现状

摘要&#xff1a;当前&#xff0c;开源第三方库生态正呈现爆发式增长趋势。GitHub 目前已托管超过 4.2 亿个代码仓库&#xff0c;远超早期统计的 1 亿规模&#xff0c;显示出开发者社区的活跃度持续攀升。同时&#xff0c;37 个主流包管理器所维护的开源组件数量可能已达到数千…

服务器开机自启动服务

前言&#xff1a; 将服务器中脚本开启自启动执行 步骤&#xff1a; 1.创建一个 systemd 服务文件: /etc/systemd/system/ 目录下创建一个新的服务文件。例如&#xff0c;命名为 myapp.service&#xff1a; sudo nano /etc/systemd/system/myapp.service2.编写 [Unit] Descri…

采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更

一、引言 在信息爆炸的时代&#xff0c;作为科技领域的内容创作者&#xff0c;我每天都要花费2-3小时手动收集行业新闻、撰写摘要并发布到各个社群。直到我发现Bright Datan8nAI这套"黄金组合"&#xff0c;才真正实现了从"人工搬运"到"智能自动化&qu…

ROS云课三分钟-3D性能测试supertuxkart和游戏推荐等-国际象棋

ROS云课三分钟-破壁篇GCompris-一小部分支持Edu应用列表-2025-CSDN博客 很多时候&#xff0c;有一种思维定势&#xff0c;将人锁住&#xff0c;人口就是囚。 口人囚~口加人等于囚-CSDN博客 如果突破&#xff0c;跳出问题&#xff0c;再看问题。 这门课程&#xff0c;或者这个平…

学习率及相关优化参数详解:驱动模型高效训练

一、引言 在模型微调的核心参数体系中&#xff0c;优化相关参数是决定训练效率与模型性能的关键变量。它们如同精密机械的齿轮&#xff0c;彼此联动、相互影响&#xff0c;共同调控着模型在参数空间中的搜索路径。本文将围绕学习率、训练轮数、批处理大小、梯度累积和学习率调…

golang 柯里化(Currying)

使用场景&#xff1a;参数在语义上属于不同组&#xff0c;Go 语法无法在单次调用中声明多组可变参数&#xff0c;通过柯里化可以实现分步接收参数。 有的参数是在不同时间段产生&#xff0c;使用Currying可以让函数记住&#xff08;缓存&#xff09;参数&#xff0c;避免应用代…

电脑革命家测试版:硬件检测,6MB 轻量无广告 清理垃圾 + 禁用系统更新

各位电脑小白和大神们&#xff0c;我跟你们说啊&#xff01;有个超牛的东西叫电脑革命家测试版&#xff0c;这是吾爱破解论坛的开发者搞出来的免费无广告系统工具集合&#xff0c;主打硬件检测和系统优化&#xff0c;就像是鲁大师这些软件的平替。下面我给你们唠唠它的核心功能…

R 语言科研绘图第 52 期 --- 网络图-分组

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

EfficientLLM: Efficiency in Large Language Models 高效大模型

目录 第1章&#xff1a;引言第2章&#xff1a;观察与见解2.1 总体观察&#xff08;Overall Observations&#xff09;2.2 从EfficientLLM基准中得出的新见解 第3章&#xff1a;背景3.1 大语言模型&#xff08;LLMs&#xff09;3.2 提升LLMs效率的方法3.2.1 硬件创新3.2.2 软件优…