cpp自学 day19(多态)

一、基本概念

同一操作作用于不同的对象,产生不同的执行结果
👉 就像「按F1键」:在Word弹出帮助文档,在PS弹出画笔设置,​同一个按键触发不同功能


(1)多态类型

类型实现方式绑定时机
静态多态函数重载、运算符重载编译时绑定
动态多态虚函数+继承体系运行时绑定

(2)动态多态三要素

多态满足条件
  • 有继承关系
  • 子类重写父类中的虚函数
多态使用条件
  • 父类指针或引用指向子类对象

重写:函数返回值类型 函数名 参数列表 完全一致称为重写 (缺一不可)

class 父类名 {
public:virtual 返回类型 函数名(参数列表) {// 函数体}
};

(3)示例代码

// 父类
class Animal {
public:virtual void speak() {  // 1. 虚函数声明cout << "动物发声" << endl;}
};// 子类
class Cat : public Animal { // 1. 继承关系
public:void speak() override { // 2. 重写虚函数cout << "喵喵" << endl; }
};// 多态调用
void doSpeak(Animal& animal) { // 3. 父类引用接收子类对象animal.speak(); // 运行时决定调用哪个实现
}void doSpeak(Animal *animal) {// 4.用指针接收子类对象animal->speak();
}void test() {Cat cat;doSpeak(cat); // 输出:喵喵
}

(4)重要特性

函数重写严格一致:(此处是函数内参数不一致)

// 错误示例:参数不同
class Animal { virtual void func(int) };
class Cat : public Animal { void func() }; // 不会触发多态

二、多态原理

当子类重写父类的虚函数,子类中的虚函数表内部,会替换成 子类的虚函数地址

class Animal
{
public://虚函数virtual void speak(){cout << "动物在说话" << endl;}
};
//猫类
class Cat : public Animal
{
public://重写 函数返回值类型 函数名 参数列表 完全相同virtual void speak(){cout << "小猫在说话" << endl;}
};

原理概况

当父类的指针或者引用指向子类对象时候,发生多态

Animal & animal = cat;
animal.speak();
vfptr - 虚函数(表)指针v - virtual
f - function
ptr - pointervtable - 虚函数表v - virtual
f - function
table - table

三、纯虚函数和抽象类

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

因此可以将虚函数改为纯虚函数,当类中有了纯虚函数,这个类也称为抽象类

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

 virtual void func() = 0;

抽象类特点:
1、无法实例化对象

若Base是抽象类,则下面两行报错
Base b;
new Base;

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

写纯虚函数意义就是想让子类重写一遍纯虚函数


四、虚析构与纯虚析构

1.核心问题

内存泄漏场景

class Animal {
public:~Animal() {  // ❌ 普通析构cout << "Animal析构" << endl;}
};class Cat : public Animal {
public:~Cat() {cout << "Cat析构" << endl;delete[] m_data;  // 堆内存资源}
private:int* m_data = new int[100];
};void test() {Animal* pet = new Cat();pet->speak();delete pet;  // 仅调用Animal析构 → 内存泄漏!
}

执行结果

Animal析构
(Cat析构未被调用 → m_data内存泄漏)

2.解决方案对比

方案类型语法示例类性质实现要求使用场景
虚析构virtual ~Animal() {}普通类必须实现需要实例化基类对象
纯虚析构virtual ~Animal() = 0;抽象类必须单独实现强制子类实现特定行为

3.具体实现

1. 虚析构函数

class Animal {
public:virtual ~Animal() {  // ✅ 虚析构声明cout << "Animal虚析构" << endl;}
};// 正确执行结果:
// Cat析构
// Animal虚析构

2. 纯虚析构函数

class Animal {
public:virtual ~Animal() = 0;  // 纯虚析构声明
};// 必须单独实现
Animal::~Animal() {  // ✅ 纯虚析构实现cout << "Animal纯虚析构" << endl;
}

特性

  • 使类成为抽象类(无法实例化)
  • 子类必须实现析构函数
class Cat : public Animal {
public:~Cat() override {  // 必须实现cout << "Cat析构" << endl;}
};

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

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

相关文章

Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

人脸考勤管理一体化系统(人脸识别系统,签到打卡)

人脸考勤管理一体化系统 项目介绍 本项目是基于Flask、SQLAlchemy、face_recognition库的人脸考勤管理一体化系统。 系统通过人脸识别技术实现员工考勤打卡、人脸信息采集、人脸模型训练等功能。 项目采用前后端分离的技术框架&#xff0c;基于Flask轻量级Web框架搭建后端服务…

单调栈学习C++

目录 一&#xff0c;每日温度 二&#xff0c;下一个更大的元素I 三&#xff0c;下一个更大的元素II 四&#xff0c;接雨水 小结&#xff1a; 单调栈是一种特殊的栈结构&#xff0c;里面的元素按照单调递增或者递减的顺序排列。常用于解决元素左边或者右边比它大或者小的问…

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…

无人机飞行术语科普!

一、基础操作类 1. 炸机 指无人机意外坠毁或严重损坏&#xff08;如撞树、撞楼、失控摔机等&#xff09;。 例句&#xff1a;“今天风太大&#xff0c;差点炸机&#xff01;” 2. 一键放生 调侃某些情况下无人机失控飞丢&#xff0c;无法找回&#xff08;源自某些品牌…

模拟算法(一):一维数组模拟

目录 模拟的概念 例1&#xff1a;开关灯 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例2&#xff1a;序列操作和查询 算法思路&#xff1a; 代码如下&#xff1a; 输入输出&#xff1a; 例3&#xff1a;数组折叠 算法思路&#xff1a; 代码如…

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…

Qt中的多种输出方式,信号与槽的基本使用

完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框&#xff0c;创建项目后&#xff0c;展开forms文件夹&#xff0c;双击ui文件进入 qt designer设计页面 找到line edit 拖到页…

英语表达年代和世纪

英语表达年代和世纪 1. Century (世纪)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英语表达年代和世纪4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的连续 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年这连续 10 年。 XX 世纪 X0 年代…

MySQL数据库管理5

23.事务 1&#xff09;事务&#xff1a;可以认为是做一件事情 需要多个SQL 要么同时成功 要么同时失败 需求&#xff1a;银行转账update 你的账户 把你的钱减少update 你朋友的账户 把他的钱增多​这两个SQL不能只成功一个 要么都成功 要么都失败那么 我们就需要用到事务了 它…

闭包和装饰器

什么是闭包 闭包&#xff08;Closure&#xff09;是 Python 中一个非常重要的概念&#xff0c;它是一种特殊的函数对象&#xff0c;通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释&#xff1a; 1.闭包的定义 闭包是指一个函数对象&#xff0c;它不仅包含函数的代…

notepad++8.6.4安装及细节

notepad8.6.4下载安装&#xff08;附安装包&#xff09; 一、安装包下载1.1方法一&#xff1a;官网下载&#xff08;点击跳转&#xff09;1.2方法二&#xff1a;网盘链接分享8.6.4版本 二、安装过程细节2.1这里的组件建议全部勾选。点击“下一步”。2.2 勾选①&#xff1a;可以…

COZE通关指南:工作流与插件开发

前言 本文隶属于专栏《AI Agent 通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《AI Agent 通关指南》 正文 1. 平台基础介绍 🌟 1.1 COZE平台概述 COZE平台(coze.cn)是一个强大的AI应用开发平台…

【Block总结】ENLTransformerBlock,高效非局部变换器块|即插即用

1. 论文信息 标题: Perspective+ Unet: Enhancing Segmentation with Bi-Path Fusion and Efficient Non-Local Attention for Superior Receptive Fields论文地址: arXiv:2406.14052 2. 创新点 双路径编码策略: 在编码器阶段引入双路径策略,结合传统卷积和空洞卷积的结果,平…

【爬虫】网易云音乐评论数据爬取

文章目录 &#x1f356; 前言&#x1f3b6;一、抓取要求✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【爬虫】网易云音乐歌词/评论数据爬取 &#x1f3b6;一、抓取要求 描述: 输入歌曲的id&#xff0c;获取对应歌曲的用户评论信…

C++使用Qt Charts创建数据可视化图表

Qt Charts 是一个强大的工具&#xff0c;用于创建直观的数据可视化图表。本文将通过一个具体的示例&#xff0c;展示如何使用 Qt Charts 创建一个包含多条数据序列、自定义坐标轴和随机数据生成的图表。 示例代码解析 以下是一个完整的示例代码&#xff0c;展示如何使用 Qt Ch…

TCP/IP五层协议

目录 1. 五层模型结构 2. 各层核心功能与协议 (1) 应用层&#xff08;Application Layer&#xff09; (2) 传输层&#xff08;Transport Layer&#xff09; (3) 网络层&#xff08;Network Layer&#xff09; (4) 数据链路层&#xff08;Data Link Layer&#xff09; (5…

【最新版】金媒婚恋系统v10.5最新稳定开源+原生前端小程序 PC端+安装教程

一.系统简介 1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好&#xff0c; 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务&#xff0c;通过红娘的介入&#xff0c;提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管…

吴恩达深度学习复盘(5)神经网络的前向传播TesorFlow与NumPy实现比对

数据结构差别 NumPy 和 TensorFlow 在数据表示上的差异展开&#xff0c;结合神经网络实践中的常见问题进行说明。以下是详细解析&#xff1a; 一、简介 数据表示的历史背景 NumPy 是 Python 科学计算的基础库&#xff0c;早期设计为处理多维数组TensorFlow 由 Google Brain 团…