多态(上)【C++】
文章目录
- 多态的概念
- 多态的实现
- 多态产生的条件
- 什么是虚函数?
- 虚函数的重写和协变
- 重写
- 协变
- 析构函数的重写
- 为什么有必要要让析构函数构成重写?
多态的概念
C++中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口可以用于不同类型的对象,而这些对象对同一消息可以做出不同的响应。
具体来说,多态性允许以统一的方式处理不同类型的对象,使得代码更加灵活和可扩展。多态通俗地说就是“多种形态”。
在不同的对象上执行相同的行为时,由于对象类型的不同,会产生不同的结果
举例来说,对于“买票”这个行为,普通人买票是全价,学生买票是半价,军人买票享有优先权。不同类型的对象(普通人、学生、军人)对同一行为产生了不同的响应。
多态的表现形式一般就是:
指向的对象不同,调用同名的函数,具体调用到的函数就不同
例
父类A和子类B中都有一个函数func(),构成多态的时候:
A*p=new A; 指向父类对象
p->func(); 就调用父类中的funcA*p=new B; 指向子类对象
p->func(); 就调用子类中的func
多态的实现
多态产生的条件
- 子类必须
重写(或者协变)父类的虚函数 - 必须是
父类的指针或者引用调用构成重写的虚函数
例

什么是虚函数?
在C++中,虚函数是使用virtual关键字修饰的非静态成员函数。
虚函数的主要作用是允许在派生类中重新定义基类的函数,从而实现多态。
关于虚函数的一些注意点:
-
虚函数就是为了实现多态而存在的,而且支持虚函数是
需要付出一定代价的
所以如果不实现多态,就不要定义虚函数 -
静态成员函数
不能做虚函数
因为
①虚表指针存在对象里,但是静态成员的生命周期比对象长,而且静态成员函数里面没有this指针,就找不到对象
②因为静态的特性:在以该父类为起始的整个继承体系中只有一份,如果实行多态的话就有多份了,这不符合静态的特性 -
在父类中声明为虚函数的成员函数,继承到子类后,这个成员函数即使没有被
virtual修饰也是虚函数。
但是还是建议在子类中也加上virtual修饰,这样代码的可读性更高
虚函数的重写和协变
重写
子类中有与父类完全相同【返回值类型、函数名、参数列表完全相同】的虚函数,称子类的虚函数重写了父类的虚函数。
例

协变
子类和父类的虚函数的返回值可以不同【其他两个(函数名,参数表)依旧必须相同】,但是满足以下3个条件的就构成协变
父类的虚函数的返回值是一个父类类型的指针或者引用子类的虚函数的返回值是一个子类类型的指针或者引用- 子类和父类的
返回值中的子类和父类必须是同一个继承体系的
例

析构函数的重写
重写的要求上面说了,即必须子类和父类的虚函数的返回值,函数名,参数表都相同才可以构成重写
但是析构函数名字的特殊性【~类名】,就让同一作用域中的两个类的析构函数的名字不可能相同,因为这两个类的类名不可能相同
所以析构函数不能构成重写吗?
并非如此。
反而因为析构函数的多态非常重要,C++又专门为它开了一条路:
任意一个类,只要它加入了继承体系,那么它的析构函数的名字就会被改成destructor
因为析构函数没有返回值和参数表,所以析构函数构成重写非常简单,只需要在父类的析构函数前面加一个virtual,让它变成虚函数就可以了。
为什么有必要要让析构函数构成重写?
如果析构函数没有构成重写,那么下面这种情况就会内存泄露:
因为析构函数没有构成多态,所以delete时候只会看指针的类型是什么,据此调用析构函数
所以只调用了父类的析构

上面的这种情况【父类指针指向new出来的子类对象】在使用多态的时候还是挺常见的,所以解决很有必要
当析构函数构成多态的时候:
因为析构函数构成了多态,所以delete时候就会看指针的指向的对象是什么,据此调用析构函数
所以会调用子类的析构

相关文章:
多态(上)【C++】
文章目录 多态的概念多态的实现多态产生的条件什么是虚函数?虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写? 多态的概念 C中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口…...
如何驱动一枚30年前的音源芯片,YMF288驱动手记 Part2
一些问题 在上一篇里面虽然策划了想要驱动YMF288所需要做的事情以及目标。但是,在板子打出来后,我在进一步的研究中,发现我犯了个错误,那就是YMF288并不是使用现在很多轻量化的嵌入式,比如ESP32常用的I2S协议的&#x…...
yarn webpack脚手架 react+ts搭建项目
安装 Yarn 首先,确保你已经安装了 Node.js 和 Yarn。如果还没有安装 Yarn,可以通过以下命令安装: npm install -g yarn创建项目 使用 create-react-app 脚手架创建一个带有 TypeScript 的项目,node更新到最新版,并指定…...
防蓝光护眼灯有用吗?五款防蓝光效果好的护眼台灯推荐
现在孩子的很多兴趣班和课后辅导班都是在线上举行,通常对着手机电脑长时间。电子产品有大量蓝光和辐射,会伤害到孩子的眼睛。但为了学习,也是没办法。护眼台灯的出现可以让孩子们的眼睛得到保护,防止蓝光对眼睛的伤害。防蓝光护眼…...
Mac使用Elasticsearch
下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz 修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl: enabled: false 切换目录 cd elasticsearch-8.15.1/…...
DevOps -CI/CD 与自动化部署
DevOps - CI/CD 与自动化部署详解 DevOps 是一种结合开发(Development)与运维(Operations)的方法论,旨在通过工具和文化变革,促进软件开发和运维之间的协作,提升软件交付的效率、质量和稳定性。…...
单体架构系统是不是已经彻底死亡?
单体架构系统并未“彻底死亡”,尽管在复杂和大规模的应用场景中,它可能不再是首选的架构模式。单体架构系统,也称为巨石系统(Monolithic),在软件发展过程中是最广泛的架构风格之一,出现时间最早…...
mathorcup发邮件:参赛必看邮件撰写技巧?
mathorcup发邮件的注意事项?如何使用mathorcup发信? 无论是提交参赛作品、咨询比赛规则,还是与组委会沟通,一封清晰、专业的邮件都能为你赢得更多机会。AokSend将为你详细介绍mathorcup发邮件的撰写技巧,帮助你在比赛…...
ESP01烧入AT出厂固件
ESP01是一种常见的WIFI模块,其核心是esp8266,常用于给主控拓展WIFI功能,因其体积较小、集成度高、造价便宜,常受到消费者喜爱,ESP01常用的开发方式有两种,一种是利用基于Arduino框架作为独立设备开发&#…...
Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽
一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…...
民间故事推广系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,民族文化管理,节日类型管理,传统节日管理,故事类型管理,民间故事管理,系统管理 微信端账号功能包括:系统首…...
关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时,自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时,将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms (典型值) 内没有变为高…...
C++ 异常
这里写目录标题 1.C语言传统的处理错误的方式2.C异常概念3.异常的用法3.1 异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.自定义异常体系5.标准库异常体系6.异常的优缺点 1.C语言传统的处理错误的方式 传统的错误处理机制: 1. 终止程序,…...
ST官方 VSCode 插件安装及配置工程参考
写在前头 VSCode的用法和插件是月初参加ST官方北京站举办的线下培训中,厂家AE工程师给我们讲的,不同于已经很多人用的(并且一直在吵的)keil assistant什么的,用的是CMake编译,抛弃了原有的keil,…...
使用Pandas读取和写入数据库的Python函数实现
使用Pandas读取和写入数据库的Python函数实现 Pandas是一个强大的数据处理和分析库,广泛应用于数据科学和机器学习领域。结合数据库操作,Pandas可以极大地简化数据的读取和写入过程。本文将详细介绍如何使用Pandas实现读取和写入数据库的函数,涵盖数据库连接、数据读取、数…...
Redis——常用数据类型hash
目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值:设置成功的键值对的个数hget HGET key field//hdel HDEL key…...
基于Python实现一个庆祝中秋节的小程序
功能包括: 使用复杂的库来计算农历日期:可以使用 lunarcalendar 库来计算农历日期。提供更多的祝福语:可以通过随机选择祝福语来增加趣味性。加入图形用户界面 (GUI):可以使用 tkinter 库来创建一个简单的图形用户界面。 我们可…...
近期最值得买的数码好物有什么?2024兼具功能和实用性的好物分享
在如今这个科技飞速发展的时代,数码好物层出不穷,它们为我们带来了前所未有的便捷与乐趣。而对于学生党和上班族来说,挑选到既实用又性价比高的数码好物,更是能为学习和办公生活增添一抹亮丽的色彩。其中,电容笔便是备…...
云服务器中的MinIO 配置 HTTPS 过程(图文)
目录 1. 基本知识2. 实战3. 彩蛋1. 基本知识 具体证书的格式如下: 私钥:private.key公钥:public.crt (公钥以pem格式结尾,可直接改为crt格式)证书和私钥文件的命名和路径应该是: 证书文件: ~/.minio/certs/public.crt 私钥文件: ~/.minio/certs/private.key使用了自定义…...
注册安全分析报告:熊猫频道
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
【仅限首批尝鲜者】Python 3.15 JIT真实生产环境对比:Django API吞吐+22%,但Flask微服务却降15%?
第一章:Python 3.15 JIT编译器的架构演进与设计哲学Python 3.15 引入了实验性但高度结构化的内置 JIT 编译器(代号 “Tartan”),标志着 CPython 首次将即时编译能力深度集成至解释器核心,而非依赖外部工具链。其设计哲…...
s2-pro多场景落地:法律文书语音宣读+重点条款强调音效添加
s2-pro多场景落地:法律文书语音宣读重点条款强调音效添加 1. 场景需求分析 在法律服务领域,文书宣读是一项高频且重要的需求。传统方式存在几个痛点: 人工宣读成本高:需要专业播音员录制,耗时耗力修改不便ÿ…...
如何优雅取消HTTP请求:async-http-client资源清理终极指南
如何优雅取消HTTP请求:async-http-client资源清理终极指南 【免费下载链接】async-http-client Asynchronous Http and WebSocket Client library for Java 项目地址: https://gitcode.com/gh_mirrors/as/async-http-client 在Java异步编程中,高…...
从技术到生态:FunASR如何构建开源语音识别新范式
从技术到生态:FunASR如何构建开源语音识别新范式 FunASR是一个端到端语音识别工具包,提供了丰富的预训练模型和便捷的开发工具,帮助开发者快速构建语音识别应用。本文将深入探讨FunASR的技术架构、核心功能、应用场景以及生态系统࿰…...
OpenClaw云端体验方案:星图平台GLM-4.7-Flash镜像快速部署
OpenClaw云端体验方案:星图平台GLM-4.7-Flash镜像快速部署 1. 为什么选择云端沙盒环境 作为一个长期折腾本地环境的开发者,我深知在个人电脑上部署AI工具链的痛苦。从CUDA版本冲突到Python依赖地狱,每次尝试新工具都要花半天时间解决环境问…...
Kook Zimage真实幻想Turbo部署案例:Jetson AGX Orin边缘设备轻量化幻想图推理尝试
Kook Zimage真实幻想Turbo部署案例:Jetson AGX Orin边缘设备轻量化幻想图推理尝试 1. 为什么在Jetson上跑幻想图?——不是“能不能”,而是“值不值” 很多人看到“幻想风格文生图”第一反应是:这得A100起步吧?显存不…...
SkeyeVSS平台录像任务调度与设备录像查询机制详解
1. 简介 在基于 GB/T 28181 国家标准构建的视频监控平台中,录像功能是核心业务之一,主要分为两类: 平台侧计划录像:由平台主动发起,通过媒体服务器向设备请求实时流,并在平台侧(本地或云存储&am…...
Anomalib使用
Anomalib 是一个专注于视觉异常检测的开源库,旨在为开发者、研究人员和工业用户提供一站式解决方案。无论是检测生产线上的产品缺陷、监控视频中的异常行为,还是识别医疗影像中的病灶,Anomalib 都能胜任。其设计理念是简单、模块化、高效&…...
langchain核心组件1-智能体
这里写目录标题简介基础使用静态模型使用动态模型简介 langchain版本 v1.x 在此版本中,langchain可以创建一个智能体 基础使用 我日常使用因为是直接对话,所以基本上只需要以下几个组件 model: 定义智能体大脑,是大语言模型地…...
Qwen3-VL-2B入门到应用:从环境部署到实际场景落地全解析
Qwen3-VL-2B入门到应用:从环境部署到实际场景落地全解析 1. 项目概述 Qwen3-VL-2B-Instruct是一款突破性的视觉语言模型,它将图像理解与自然语言处理能力完美结合。不同于传统只能处理文本的AI模型,这款模型能够真正"看懂"图片内…...
