当前位置: 首页 > news >正文

多 态

1多态的基本概念

多态是C++面向对象三大特性之一

多态分为两类

静态多态: 函数重载和运算符重载属于静态多态,复用函数名

动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

静态多态的函数地址早绑定–--编译阶段确定函数地址

动态多态的函数地址晚绑定–--运行阶段确定函数地址

动态多态满足条件

1、有继承关系

2、子类重写父类的虚函数

动态多态使用

父类的指针或者引用 指向子类对象

class Animal {

public :

//虚函数

virtual void Speak()

{

cout << "动物在发声" << endl;

}

};

//猫类

class Cat : public Animal {

public:

// 重写函数 返回值类型 函数名 参数列表 完全相同

void Speak() {

cout << "小猫在说话" << endl;

}

};

//狗

class Dog : public Animal {

public:

void Speak() {

cout << "小狗在说话" << endl;

}

};

//执行说话的函数

//地址早绑定 在编译阶段 确定函数地址

//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定

void doSpeak(Animal &animal) {// Animal & animal = cat;

animal.Speak();

}

void test345() {

Cat cat;

doSpeak(cat);

Dog dog;

doSpeak(dog);

}

2.纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

因此可以将虚函数改为纯虚函数

纯虚函数语法: virtual 返回值类型 函数名(参数列表) = 0 ;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点:

不允许实例化对象

子类必须重写抽象类中的纯虚函数,否则也属于抽象类

// 纯虚函数和抽象类

class HeyY {

public:

//纯虚函数

//只要有一个纯虚函数,这个类称为抽象类

//抽象类特点:

//1、无法实例化对象

virtual void func() = 0;

//2、抽象类的子类 必须要重写父类的纯虚函数,否则也属于抽象类

};

class HeyW : public HeyY {

virtual void func()

{

cout << "Son using func " << endl;

}

};

void test346() {

//Base b;

HeyY * hy = new HeyW;

hy->func();

}

3.虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方式: 将父类中的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

·可以解决父类指针释放子类对象

·都需要有具体的函数实现

虚析构和纯虚析构区别:

如果是纯虚析构,该类属于抽象类,无法实例化对象

虚析构语法:

virtual ~类名(){}

纯虚析构语法:

virtual ~类名()=0;

类名 : : ~类名(){}

总结:

1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象

2.如果子类中没有堆区数据,可以不写为虚析构或纯虚析构

3.拥有纯虚析构函数的类也属于抽象类

class DW

{

public :

DW() {

cout << "DW构造函数调用" << endl;

}

// 利用虚析构可以解决父类指针 释放子类对象时不干净的问题

/*virtual ~DW() {

cout << "DW析构函数调用" << endl;

}*/

//纯虚函数

virtual void speak() = 0;

//纯虚析构 需要声明也需要实现

// 有了纯虚析构之后,这个类也属于抽象类,无法实例化对象

virtual ~DW() = 0;

};

DW:: ~DW() {

cout << "DW纯析构函数调用" << endl;

}

//鱼类

class Fish:public DW

{

public:

string * m_name;

Fish(string name) {

cout << "Fish构造函数调用" << endl;

m_name = new string(name);//开辟在堆区,并用指针维护

}

virtual void speak() {

cout <<*m_name<< "fish 在冒泡" << endl;

}

~Fish() {

if (m_name != NULL) {

cout << *m_name << "Fish析构函数调用" << endl;

delete m_name;

m_name = NULL;

}

}

};

void test90() {

DW *dw = new Fish("liyu");

dw->speak();

//父类指针在析构时候 不会调用子类中析构函数,导致子类如果有堆区属性,出现内存泄漏

delete dw;

}

相关文章:

多 态

1多态的基本概念多态是C面向对象三大特性之一多态分为两类静态多态: 函数重载和运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定–--编译阶段确定函数地址动态多态的函数地址晚绑定–--运…...

Java集合

集合、数组都是对多个数据进行存储操作的结构&#xff0c;简称java容器 &#xff08;此时的存储&#xff0c;主要指的是内存层面的存储&#xff0c;不涉及持久化的存储&#xff09; 数组存储的特点&#xff1a; 一旦初始化&#xff0c;其长度就确定了。数组一旦定义好&#x…...

高校借力泛微,搭建一体化、流程化的​内控管理平台

财政部《行政事业单位内部控制规范&#xff08;试行&#xff09;》中明确规定&#xff1a;行政事业单位内部控制是指通过制定制度、实施措施和执行程序&#xff0c;实现对行政事业单位经济活动风险的防范和管控&#xff0c;包括对其预算管理、收支管理、采购管理、资产管理、建…...

使用人工智能赚钱的方式,行业领域有哪些?

使用人工智能赚钱的方式&#xff0c;行业领域有哪些&#xff1f;不少于2000字。 一、人工智能的应用领域 1、金融服务&#xff1a;金融服务行业是人工智能应用的领域之一&#xff0c;它可以帮助银行、信用卡公司等金融机构实现快速、有效的贷款审批&#xff0c;以及客户分析、…...

【数组中重复的数字】-C语言-题解

原题链接&#xff1a;数组中重复的数字 一、描述&#xff1a; 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数…...

C++调用Python脚本进行18次循环操作后,脚本不执行

C调用Python脚本进行18次循环操作后&#xff0c;脚本不执行 现象&#xff1a; 发送端接收端 从第二张图中可以看出&#xff0c;python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试&#xff0c;均在第18次循环执行时&#xff0c;出现上述问…...

字节10年架构师职业发展经历,助你做好职业规划

一直以来程序员这一职业都给人高薪资的印象&#xff0c;近年来随着互联网行业的快速发展&#xff0c;程序员更是人满为患&#xff0c;然而很多人关注的却是程序员的薪资&#xff0c;而非职业本身。 一批批程序员进入工作岗位&#xff0c;但是很多人并没有对自己的职业生涯有清…...

ArrayList真的是因为实现了RandomAccess接口才能做到快速随机访问的吗

ArrayList和RandomAccess接口RandomAccess 接口Collections.binarySearch()源码总结RandomAccess 接口 首先&#xff0c;RandomAccess接口是什么&#xff0c;以下代码可见&#xff1a; public interface RandomAccess { }RandomAccess接口其实是一个标记接口&#xff0c;它只…...

OSI七层模型与物理层与设备链路层

目录 协议 举例 OSI七层模型 理解七层模型 以下为OSI七层模型数据逐层封装和数据逐层解封的过程 TCP/IP参考模型 数据包的层层封装与层层拆包 各层的数据以及协议 封装所用的协议的数字表示形式 物理层 模拟信号 模拟信号特点 数字信号 数字信号特点 数据通信模…...

Java8的Optional类的使用 和 Stream流式操作

Java知识点总结&#xff1a;想看的可以从这里进入 目录13.6、Optional类13.7、Stream13.7.1、Stream创建13.7.2、中间操作1、筛选2、切片3、映射4、排序13.7.3、终止操作1、遍历2、聚合3、匹配查找4、归约5、收集归集统计分组字符串拼接归约13.6、Optional类 Optional类是一个…...

Authorization Server 认证服务

Hi Auth HiAuth是一个开源的基于Oauth2协议的认证、授权系统&#xff0c;除了标准的Oauth2授权流程功能外&#xff0c;还提供了应用管理、用户管理、权限管理等相关功能。 在这个项目中你能够了解到如何基于spring-security-oauth2-authorization-server实现自己的Authorizat…...

研制过程评审活动(五)生产定型阶段

1. 生产定型阶段主要任务 生产定型的主要任务是对产品批量生产条件和质量稳定情况进行全面考核,以确认产品是否达到批量生产的标准。   需要生产定型的军工产品,在完成设计定型并经小批量试生产后、正式批量生产之前,进行生产定型。生产定型的条件和时间,由定委在批准设计…...

NCUT加权的NMF

矩阵定义 X&#xff1a;特征矩阵&#xff0c;矩阵的维度为体素数mx&#xff08;指标数x被试数&#xff09;n S&#xff1a;相似性矩阵&#xff0c;由特征矩阵的每一行计算皮尔逊相关得到mxm的方阵 D&#xff1a;度矩阵&#xff0c;度矩阵的对角线元素由相似性矩阵S对应的行和…...

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]” 它的作用是&#xff0c;帮你绕…...

vue3中使用jszip压缩文件

1、安装依赖 npm install jszip npm install file-saver --save 2、使用 <template><el-card class"mb15"><template #header><span>jszip</span></template><!-- 二维码容器 --><div id"qrCodeBox">&…...

React 虚拟DOM的前世今生

引文 通过本文你将了解到 什么是虚拟DOM&#xff1f;虚拟DOM有什么优势&#xff1f;React的虚拟Dom是如何实现的&#xff1f;React是如何将虚拟Dom转变为真实Dom&#xff1f; 一、前言 要了解虚拟DOM&#xff0c;我们先明确一下DOM的概念。 根据MDN的说法&#xff1a; 文档…...

Java环境变量配置

一、Path环境变量配置设置环境变量的值&#xff1a;C:\Program Files\Java\jdk-17\bin目前较新的JDK安装时会自动配置javac、java程序的路径到Path环境变量中去 &#xff0c;因此&#xff0c;javac、java可以直接使用。注意&#xff1a;以前的老版本的JDK在安装的是没有自动配置…...

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…...

Redis高可用集群方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 @[TOC](文章目录)主从复制哨兵模式(sentinel)Cluster集群在生产过程中,Redis不一定会单独部署。因为一旦redis服务因为某些原因导致无法提供数,那么redis就不可用了。那么实现redis高可用的方式就…...

企业微信机器人发送消息

前言 随着科技的发展,各企业公司的业务不断发展,那么就需要强有力的沟通软件,其中企业微信、钉钉的能力得到了大众的认可,今天这篇文章就讲其中的一个功能-调用企业微信机器人(下文简称应用)进行消息传递。它的好处有哪些呢?自然是可以让相关人员及时追踪任务进度。 一、…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...