多 态

news2025/7/9 20:51:28

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;

}

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

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

相关文章

操作系统(day13)-- 虚拟内存;页面分配策略

虚拟内存管理 虚拟内存的基本概念 传统存储管理方式的特征、缺点 一次性&#xff1a; 作业必须一次性全部装入内存后才能开始运行。驻留性&#xff1a;作业一旦被装入内存&#xff0c;就会一直驻留在内存中&#xff0c;直至作业运行结束。事实上&#xff0c;在一个时间段内&…

usb闪存驱动器数据恢复该怎么进行?3个方法总结

“怎么办&#xff1f;我的USB驱动器不知道因为什么原因&#xff0c;里面的数据、文件都消失了。有没有什么方法在没有进行备份的情况下恢复从U盘丢失的数据&#xff1f;” USB驱动器作为最常用的存储移动设备&#xff0c;里面保存着各种文件数据。但是有时会出现损坏而导致数据…

麦克风分类汇总

1.麦克风分类汇总 1)按声电转换原理分为&#xff1a;电动式&#xff08;动圈式、铝带式&#xff09;&#xff0c;电容式&#xff08;直流极化式&#xff09;、压电式&#xff08;晶体式、陶瓷式&#xff09;、以及电磁式、碳粒式、半导体式等。 2)按声场作用力分为&#xff1a…

广域网技术(PAP和CHAP)

第十六章&#xff1a;广域网技术 随着经济全球化与数字化变革加速&#xff0c;企业规模不断扩大&#xff0c;越来越多的分支机构出现在不同的地域。每个分支的网络被认为一个LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;&#xff0c;总部和各分支机构之间…

Tr0ll1靶机训练

信息收集 主机探测 端口扫描 21,22,80端口开放通过浏览器访问并进行指纹识别&#xff0c;并没没有发现什么有用信息 测试 观察发现21端口开放&#xff08;ftp&#xff09;尝试进行匿名登录发现其中存在一个流量文件将其下载 并将文件用wirwshark打开&#xff0c;追踪其TCP流(…

451个PyPI包安装Chrome扩展以窃取加密信息

发现有超过450个恶意的PyPI Python软件包会安装恶意浏览器扩展&#xff0c;以劫持基于浏览器的加密钱包和网站进行的加密货币交易。自2022年11月首次启动后&#xff0c;至今仍在延续&#xff0c;从最初只有27个恶意的PyPI软件包&#xff0c;在过去几个月中到现在正大幅扩张。这…

RocketMQ事务消息

RocketMQ事务消息 RocketMq提供的一种高级消息类型&#xff0c;支持在分布式场景下面保障消息生产和本地事务的一致性 生产者将消息发送到服务端服务端将消息持久化成功后&#xff0c;向生产者返回ACK确认消息发送成功&#xff0c;此时消息状态为待投递,这种状态下的消息称之为…

2、MySQL5.7安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;MySQL&#xff1a;https://www.aliyundrive.com/s/o37N4pWdzyz提取码: xs12一、MySQL安装包下载MySQL官方网站下载速度太慢&#xff0c;这里推荐使国内的开源镜像站。推荐清华大学镜像站&#xff1a;https://mirrors.tuna.tsi…

如何通过一台 iPhone 申请一个 icloud 邮箱账号 后缀为 @icloud.com

总目录 iOS开发笔记目录 从一无所知到入门 文章目录需求关键步骤步骤后续需求 在 iPhone 自带的邮箱软件中添加账号&#xff0c;排第一位的是 iCloud 邮箱&#xff1a; 选 iCloud 之后&#xff1a; 提示信息是exampleicloud.com&#xff0c;也就是说是有icloud.com为域的邮箱…

前端学习第二阶段-第1、2章

01第一章 移动web网页开发课前导学 1-1 移动web网页开发课前导学 02第二章 H5C3进阶【v6.5】 2-1 vscode编辑器基本使用 01vscode 基本使用 02vscode插件安装 2-2 HTML5新增标签【复习】 01-什么是HTML5 02-HTML5新增标签 03-多媒体音频标签 04-多媒体视频标签 05-HTML5新增i…

智能小车PWM调速原理

电机驱动电路智能小车电机的驱动芯片采用L293D。L293D是一款单片集成的高电压、高电流、4通道电机驱动&#xff0c;设计用于连接标准DTL或TTL逻辑电平&#xff0c;驱动电感负载&#xff08;诸如继电线圈、DC和步进电机&#xff09;和开关功率晶体管等等。L293D有4个通道&#x…

APB总线详解及手撕代码

本文的参考资料为官方文档AMBA™3 APB Protocol specification文档下载地址&#xff1a; https://pan.baidu.com/s/1Vsj4RdyCLan6jE-quAsEuw?pwdw5bi 提取码&#xff1a;w5bi APB端口介绍介绍总线具体握手规则之前&#xff0c;需要先熟悉一下APB总线端口&#xff0c;APB的端口…

【跟我一起读《视觉惯性SLAM理论与源码解析》】第二章 编程及编译工具

23.2.21终于拿到六哥的新书 感觉很是不错&#xff0c;打算近期写一写心得之类的 废话不多说&#xff0c;直接开啃 PS&#xff1a;我的建议是阅读完十四讲后再来看这本书&#xff0c;效果应该会很不错。 因为第一章都是介绍之类的我觉得没什么整理的必要&#xff0c;所以直接来…

Netty高级应用之:编解码器与群聊天室开发

Netty高级应用之&#xff1a;编解码器与群聊天室开发 文章目录Netty高级应用之&#xff1a;编解码器与群聊天室开发Netty编解码器Java的编解码Netty编解码器概念解码器(Decoder)编码器(Encoder)编码解码器CodecNetty案例-群聊天室聊天室服务端编写聊天室客户端编写Netty编解码器…

ChatGPT爆火背后的真相:学编程已经成为必选项

这一阵最热门的话题&#xff0c;莫过于人工智能新选手——ChatGPT&#xff0c;在推出后只用了两个月就积累了1亿用户&#xff01;它的出现在科技圈掀起了一阵“惊涛骇浪”&#xff0c;有人称ChatGPT的意义&#xff0c;堪比当年蒸汽机的出现&#xff0c;它足以爆发新一轮的“工业…

什么耳机适合跑步、挑选五款最佳的跑步耳机推荐

在进行户外跑步、骑行等运动&#xff0c;往往会感到枯燥乏味&#xff0c;很难坚持下去&#xff0c;就像我经常跑一圈就觉得没了动力&#xff0c;但是当我戴上耳机听音乐跑步时&#xff0c;不知不觉就结束了&#xff0c;就感觉时间过得很快。不过话有说回来&#xff0c;适合跑步…

【Spark分布式内存计算框架——离线综合实战】1. 综合实战概述

离线综合实战 大数据营销是基于多平台的大量数据&#xff0c;依托大数据技术的基础上&#xff0c;应用于互联网广告行业的营销方式。大数据营销的核心在于让网络广告在合适的时间&#xff0c;通过合适的载体&#xff0c;以合适的方式&#xff0c;投给合适的人。大数据营销是精…

buu [WUSTCTF2020]情书 1

题目描述&#xff1a; 题目分析&#xff1a; 翻译一下可知&#xff1a; 前提&#xff1a;用0、1、2、……枚举字母表25 使用RSA系统 加密&#xff1a;0156 0821 1616 0041 0140 2130 1616 0793 公钥&#xff1a;2537和13 私钥&#xff1a;2537和937 从提示可以得知 n 2537 , …

盘点四种自动化测试模型实例及优缺点

一&#xff0c;线性测试 1.概念&#xff1a; 通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。 &#xff08;操作&#xff0c;重复操作&#xff0c;数据&#xff09;都混合在一起。 2.优点&#xff1a; 每个脚本相对独立&#xff0…

leetcode1143 最长公共子序列LCS

这道题目核心的一行代码就是判断s1的第i个字符和s2的第j个字符是否相等 是s1.charAt(i-1)s2.charAt(j-1) 而不是s1.charAt(i)s2.charAt(j) 动态规划就是搞清楚dp[i][j]的含义然后写出动态转移方程 (1)dp[i][j]的含义 dp[i][j]表示考虑s1的前i个字符&#xff0c;考虑s2的前j…