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

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;}
};

相关文章:

cpp自学 day19(多态)

一、基本概念 同一操作作用于不同的对象&#xff0c;产生不同的执行结果 &#x1f449; 就像「按F1键」&#xff1a;在Word弹出帮助文档&#xff0c;在PS弹出画笔设置&#xff0c;​同一个按键触发不同功能 &#xff08;1&#xff09;多态类型 类型实现方式绑定时机​静态多态…...

Unity:销毁(Destroy)

Destroy的基本概念 Destroy是Unity提供的一个方法&#xff0c;用于立即或延迟销毁游戏对象&#xff08;GameObject&#xff09;或其组件&#xff08;Component&#xff09;。它会从场景中移除对象&#xff0c;并释放相关资源&#xff08;比如内存&#xff09;。 语法 销毁Ga…...

【C++初阶】模板进阶

目录 模板参数 模板的特化 函数特化 类模板特化 全特化 偏特化 模板分离编译 分离编译 模板的分离编译 为什么模板不支持声明和定义分离呢&#xff1f; 解决方法 模板总结 优点 缺点 模板参数 模板参数分为类型形参和非类型参数 类型形参&#xff1a;出现在模板…...

BN 层的作用, 为什么有这个作用?

BN 层&#xff08;Batch Normalization&#xff09;——这是深度神经网络中非常重要的一环&#xff0c;它大大改善了网络的训练速度、稳定性和收敛效果。 &#x1f9e0; 一句话理解 BN 层的作用&#xff1a; Batch Normalization&#xff08;批归一化&#xff09;通过标准化每一…...

CNN 里面能自然起到防止过拟合的办法

在 CNN&#xff08;卷积神经网络&#xff09;中&#xff0c;其实有 一些结构和机制 天然就具有防止过拟合&#xff08;overfitting&#xff09;的作用&#xff0c;不完全依赖额外的正则化手段。 &#x1f9e0; 一、CNN 天然防过拟合的几个原因&#xff1a; 1️⃣ 局部连接&…...

存储基石:深度解读Linux磁盘管理机制与文件系统实战

Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备&#xff08;如硬盘、SSD、USB 等&#xff…...

AI Agent设计模式六:ReAct

概念 &#xff1a;思考-执行循环系统 ✅ 优点&#xff1a;提升任务完成度&#xff0c;适合复杂问题拆解❌ 缺点&#xff1a;执行延迟较高&#xff0c;资源消耗大 from langchain_core.messages import SystemMessage, HumanMessage, ToolMessage, AIMessage from langgraph.pr…...

使用MySQL时出现 Ignoring query to other database 错误

Ignoring query to other database 错误 当在远程连接软件中输入MySQL命令出现该错误 导致错误原因是&#xff1a;登录mysql时账户名没有加上u 如果出现该错误&#xff0c;退出mysql&#xff0c;重新输入正确格式进入即可&#xff01;...

(三)链式工作流构建——打造智能对话的强大引擎

上一篇&#xff1a;&#xff08;二&#xff09;输入输出处理——打造智能对话的灵魂 在前两个阶段&#xff0c;我们已经搭建了一个基础的智能对话&#xff0c;并深入探讨了输入输出处理的细节。今天&#xff0c;我们将进入智能对话的高级阶段——链式工作流构建。这一阶段的目…...

跳跃连接(Skip Connection)与残差连接(Residual Connection)

1. 跳跃连接&#xff08;Skip Connection&#xff09;的基本概念 跳跃连接是一种在深度神经网络中广泛应用的技术&#xff0c;它允许信息在网络中跨层直接传递。在传统的神经网络里&#xff0c;每一层的输出仅仅是前一层输出经过特定变换后的结果。而在具备跳跃连接的网络中&a…...

[特殊字符] 通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤 [特殊字符]

&#x1f31f; 引言 在企业应用开发中&#xff0c;Dynamics 365 Online作为微软的核心CRM平台&#xff0c;提供了强大的Web API接口。本文将教你如何通过Postman和OAuth 2.0认证实现与Dynamics 365的安全连接&#xff0c;轻松调用数据接口。 &#x1f4dd; 准备工作 工具安装…...

什么是RPC通信

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;通信是一种允许程序像调用本地函数一样调用远程服务器上函数的通信技术。它简化了分布式系统中的网络交互&#xff0c;隐藏了底层网络通信的复杂性&#xff0c;使开发者能够专注于业务逻辑。 一、RPC…...

HANA如何在存储过程里执行动态SQL

业务场景需求&#xff1a; 在HANA里如何实现动态的SQL控制&#xff0c;比如需要多个单据里&#xff0c;实现某个自定义字段不允许重复 一般的写法是需要在每个业务单据里加对应的存储过程控制&#xff0c;这样的话&#xff0c;需要在每个业务单据里进行控制&#xff0c;SQL维…...

NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)

区间问题是另⼀种⽐较经典的贪⼼问题。题⽬⾯对的对象是⼀个⼀个的区间&#xff0c;让我们在每个区间上做出取舍。 这种题⽬的解决⽅式⼀般就是按照区间的左端点或者是右端点排序&#xff0c;然后在排序之后的区间上&#xff0c;根据题⽬要求&#xff0c;制定出相应的贪⼼策略&…...

0101安装matplotlib_numpy_pandas-报错-python

文章目录 1 前言2 报错报错1&#xff1a;ModuleNotFoundError: No module named distutils报错2&#xff1a;ERROR:root:code for hash blake2b was not found.报错3&#xff1a;**ModuleNotFoundError: No module named _tkinter**报错4&#xff1a;UserWarning: Glyph 39044 …...

SQL ServerAlways On 可用性组配置失败

问题现象&#xff1a; 配置 Always On 可用性组时&#xff0c;报错 “无法将数据库加入可用性组”&#xff08;错误 41158&#xff09;&#xff0c;或提示 “WSFC 群集资源无法联机”&#xff08;错误 19471&#xff09;。 快速诊断 验证 WSFC 群集状态&#xff1a; # 检查群集…...

01 - UnLua访问蓝图

前文回顾&#xff1a;配置好了智能提示和调试 分别对私有的和公开函数&#xff0c;变量&#xff0c;组件&#xff0c;事件进行测试。 测试 在BeginPlay中&#xff0c;分别访问他们。这里引入了GetDisplayName函数打印相机组件名 打印结果&#xff1a; 结论 不管是私有的&…...

6.5.图的基本操作

一.图的基本操作&#xff1a; 1.判断图G是否存在弧<x,y>或边(x,y)&#xff1a; a.使用邻接矩阵来实现判断无向图G中是否存在边(x,y)&#xff1a; 以上述图片的无向图为例&#xff0c;用邻接矩阵存储无向图时想要判断两个顶点之间是否有边是很方便的&#xff0c; 比如判…...

2025全新开源双端系统源码:获取通讯录、相册、短信、定位及已装应用信息

分享一套全新上线的双端信息采集系统源码&#xff0c;支持提取通讯录、相册、短信、定位信息及已安装应用数据。源码完全开源&#xff0c;只做轻微测试需要的自取&#xff0c;简易教程放在压缩包里面了&#xff0c;欢迎有需要的朋友自取参考。 下载地址&#xff1a;下载地址.t…...

es基本概念

Elasticsearch 的架构与基本概念 Elasticsearch&#xff08;简称 ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。 Elasticsearch 的架…...

算法刷题记录——LeetCode篇(2.5) [第141~150题](持续更新)

更新时间&#xff1a;2025-04-04 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通…...

【Rust学习】Rust数据类型,函数,条件语句,循环

本文专栏&#xff1a;Rust学习 目录 一&#xff0c;数据类型 1&#xff0c;标量类型 1.1&#xff0c;整型 1.2&#xff0c;整型溢出 1.3&#xff0c;浮点数型 1.4&#xff0c;布尔类型 1.5&#xff0c;字符型 2&#xff0c;复合类型 2.1&#xff0c;Tuple(元组) 2.2&am…...

PgVectore的使用

PgVectore的使用 一、PgVector的安装 参照博客&#xff1a;https://blog.csdn.net/u012953777/article/details/147013691?spm1001.2014.3001.5501 二、PgVector的使用 1、创建表与插入数据​ ​​定义向量字段​​&#xff1a; CREATE TABLE items (id SERIAL PRIMARY …...

智能工厂的数字孪生与信息物理系统架构研究

摘要 本文以工业 4.0 为背景&#xff0c;系统分析数字孪生&#xff08;Digital Twin&#xff09;与信息物理系统&#xff08;CPS&#xff09;在智能工厂中的协同架构。通过构建 "感知 - 映射 - 决策 - 执行" 的四层技术框架&#xff0c;结合三一重工、海尔等企业案例…...

基于YOLO11实例分割与奥比中光相机的快递包裹抓取点检测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏&#xff0c;查看更多内容。 0 引言 项目采用六轴机械臂搭配末端真空吸盘&#xff0c;从无序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取点的3D坐标与3D姿态。由于快递包裹含…...

简单程序语言理论与编译技术·22 实现一个从AST到RISCV的编译器

本文是记录专业课“程序语言理论与编译技术”的部分笔记。 LECTURE 22&#xff08;实现一个从AST到RISCV的编译器&#xff09; 一、问题分析 1、完整的编译器&#xff08;如LLVM&#xff09;需先完成AST到IR的转换&#xff0c;并进行代码优化&#xff0c;再到汇编&#xff0…...

无锡无人机驾驶证培训费用

无锡无人机驾驶证培训费用&#xff0c;随着科技的迅速发展&#xff0c;无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测&#xff0c;再到物流运输与城市规划&#xff0c;无人机的应用场景不断扩展&#xff0c;因此越来越多的人开始意识到学习无人机驾驶技能的重…...

[ctfshow web入门] web5

前置知识 引用博客&#xff1a;phps的利用 当服务器配置了 .phps 文件类型时&#xff0c;访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码&#xff0c;而不是执行它。.phps被作为辅助开发者的一种功能&#xff0c;开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …...

第五章:架构安全性_《凤凰架构:构建可靠的大型分布式系统》

第五章 架构安全性 一、认证机制 核心知识点&#xff1a; 认证标准&#xff1a; HTTP Basic认证&#xff1a;Base64编码传输凭证&#xff0c;需配合HTTPS使用OAuth 2.0&#xff1a;授权框架&#xff0c;重点掌握四种授权模式&#xff1a; 授权码模式&#xff08;最安全&#…...

控件主题效果添加程序设计

以下是针对Qt Designer设计的控件添加阴影效果的完整解决方案&#xff0c;结合可视化设置与动态主题支持&#xff1a; 一、基础阴影效果实现方案 1. 通过QSS实现简易阴影&#xff08;适用于简单需求&#xff09; /* 使用多重边框模拟阴影效果 */ QFrame#customWidget {borde…...

用swift playground写个ios应用和大模型或者网站交互

import SwiftUIstruct ContentView: View {State private var textFieldText: String ""State private var outputText: String "输出将会显示在这里"private let tip:String "消息已发送&#xff0c;请等待"State private var history:[Stri…...

Mlivus Cloud SDK v2的革新:从痛点剖析到实战优化

目录 从V1到V2:开发者体验的范式转变 深度解析SDK v2的架构革新 1. 统一接口范式:终结API混乱时代 2. 原生异步支持:高并发场景的性能救星 3. Schema Cache机制:性能优化的隐形冠军 4. 全功能REST API:简化集成的关键 实战指南:从迁移到深度优化 平滑迁移策略 性…...

【图像处理基石】什么是AWB?

1. AWB&#xff08;自动白平衡&#xff09;的定义 AWB&#xff08;Auto White Balance&#xff09;是一种图像处理技术&#xff0c;通过算法校正不同色温光源下图像的色彩偏差&#xff0c;使白色在任何光照条件下都能准确呈现为白色&#xff0c;从而让图像颜色更接近人眼真实感…...

[蓝桥杯 2017 省 B] k 倍区间

P8649 [蓝桥杯 2017 省 B] k 倍区间 题目描述 给定一个长度为 N N N 的数列&#xff0c; A 1 , A 2 , ⋯ A N A_1,A_2, \cdots A_N A1​,A2​,⋯AN​&#xff0c;如果其中一段连续的子序列 A i , A i 1 , ⋯ A j ( i ≤ j ) A_i,A_{i1}, \cdots A_j(i \le j) Ai​,Ai1​,⋯…...

基于SSM的高校宿舍水电管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【LLM系列】1.大模型简介

1. 基础 1.1 如何权衡模型的复杂度和性能&#xff1f; ├── a. 模型架构选择 │ ├── 简化架构 │ │ └── 选择较小的网络层数和宽度&#xff0c;降低复杂度&#xff1b; │ │ 可使用高性能基础模型如 Transformers 作为起点&#xff0c;根据需求缩放模型。 │ └──…...

从概念和设计哲学的角度详细解析工厂模式

从概念和设计哲学的角度详细解析工厂模式。 1. 工厂模式的核心目标 解耦&#xff1a;将对象的创建过程与使用过程分离&#xff0c;使用者无需关心对象如何被创建。 统一入口&#xff1a;通过一个接口或方法控制对象的生成&#xff0c;隐藏底层实现细节。 类比现实中的工厂&am…...

AI小白:机器学习VS深度学习

1 特征工程的范式革命 传统机器学习&#xff1a;手工特征工程的艺术 在传统机器学习中&#xff0c;特征工程是一个关键步骤&#xff0c;它涉及将原始数据转化为能够被机器学习模型高效利用的特征。这通常需要领域专家的经验和知识&#xff0c;以手动设计和提取特征。 例如&a…...

对应列表数据的分割和分组

要基于指定的流派列表分割数据&#xff0c;可以使用 布尔索引 或 groupby 结合筛选。以下是具体方法&#xff1a; 场景假设 数据列 genres 中的值可能是多流派的字符串&#xff0c;例如 "drama,action" 或 ["drama", "action"]。目标&#xff1…...

信息物理系统(CPS):中国 AI(DEEPSEEK)的未来路径

一、引言 人工智能&#xff08;AI&#xff09;的发展正从通用模型向垂直领域渗透&#xff0c;而信息物理系统&#xff08;CPS&#xff09;作为连接数字世界与物理世界的桥梁&#xff0c;为 AI 提供了新的发展方向。中国 AI 企业如 DEEPSEEK 通过开源策略和本土化优势&#xff…...

SEO长尾词优化实战技巧

内容概要 长尾关键词作为SEO策略的重要组成部分&#xff0c;能够有效捕捉细分领域的精准流量&#xff0c;降低竞争成本的同时提升转化效率。本文系统梳理了从关键词挖掘到流量转化的全链路优化方法&#xff0c;重点解析工具使用、布局策略及搜索意图匹配三大核心模块。通过结合…...

爬虫自动化工具:DrissionPage

1. DrissionPage初始 官网地址&#xff1a;&#x1f6f0;️ 概述 | DrissionPage官网 在当今互联网高速发展的时代&#xff0c;网页数据的获取和处理变得愈发重要。传统的自动化工具如 Selenium 在某些方面逐渐显露出一些局限性&#xff0c;而 DrissionPage 正是在这样的背景下…...

扩展库Scrapy:Python网络爬虫的利器

目录 一、扩展机制的核心原理 二、六大实用扩展库详解 1. 动态渲染神器&#xff1a;scrapy-playwright 2. 分布式架构&#xff1a;scrapy-redis 3. 反反爬利器&#xff1a;scrapy-zyte-smartproxy 4. 智能调度&#xff1a;scrapy-thunder 5. 数据管道&#xff1a;scrapy…...

L3-21

exer01 Message # 1.定义Message消息类和cmd,content,sender,to四个属性&#xff0c;其中to默认为None class Message:def __init__(self, cmd, content, sender, toNone):self.cmd cmdself.content contentself.sender senderself.to to # 2. 创建登录消息对象msg1,聊天消…...

04.游戏开发-unity编辑器详细-工具栏、菜单栏、工作识图详解

04.游戏开发&#xff0c;unity编辑器详细-工具栏、菜单栏、工作识图详解 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希…...

GRBL运动控制算法(二)圆弧插补

前言 GRBL 是一款高性能、开源的嵌入式 CNC&#xff08;计算机数控&#xff09;控制器固件&#xff0c;专为 Arduino 平台优化&#xff0c;广泛应用于雕刻机、激光切割机、3D 打印机及其他精密运动控制场景。自 2009 年发布以来&#xff0c;GRBL 凭借其高效的运动规划算法、稳…...

《P1072 [NOIP 2009 提高组] Hankson 的趣味题》

题目描述 Hanks 博士是 BT&#xff08;Bio-Tech&#xff0c;生物技术) 领域的知名专家&#xff0c;他的儿子名叫 Hankson。现在&#xff0c;刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上&#xff0c;老师讲解了如何求两个正整数 c1​ 和 c2​ 的最大公约数…...

矩阵分解中的梯度下降:详细实现方案(包含数学推导、代码实现和优化技巧)

矩阵分解中的梯度下降:详细实现方案(包含数学推导、代码实现和优化技巧) 矩阵分解是机器学习和数据科学中重要的技术,广泛应用于推荐系统、自然语言处理、图像处理等领域。梯度下降作为一种优化算法,在矩阵分解中常用于最小化目标函数以找到最佳的矩阵近似。本指南将详细…...

STM32F103C8T6实现 SG90 360 °电机转动

简介 基于上一篇 STM32F103C8T6实现 SG90 180 电机任意角度转动 本来想实现角度转动, 但靠舵机本身无法实现限位, 需要记录位置, 并且根据转速计算大概位置, 存在误差&#xff0c; 不实现角度转动了, 只实现正反转 代码 正向速度0.75为最大速度, 反向2.25&#xff0c; 接近1.5…...

RTDETR融合[CVPR2025]DnLUT中的MuLUTUnit模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《DnLUT: Ultra-Efficient Color Image Denoising via Channel-Aware Lookup Tables》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2503.15931 代码链接&#xf…...