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

高程 | 多态性(c++)

文章目录

  • 📚多态
  • 📚运算符重载
    • 🐇定义
    • 🐇规则
    • 🐇友元运算符重载函数
    • 🐇成员运算符重载函数
  • 📚虚函数
  • 📚纯虚函数和抽象类

📚多态

  • 多态:同样的消息被不同类型的对象接收时导致不同的行为。
  • 类型
    • ⭐️重载多态:普通函数及类的成员函数的重载。
    • ⭐️强制多态:将一个变元的类型加以变化,以符合一个函数或者操作的要求。
    • ⭐️包含多态:类族中定义于不同类中的同名成员函数的多态行为,主要是通过虚函数实现。
    • ⭐️参数多态:与类模板相关联。
  • 多态的实现:编译时的多态性和运行时的多态性。
    • 前者为函数重载和模板,事先设定好。
    • 后者动态联编程序运行时才能确认是用哪个函数。

📚运算符重载

  • 运算符重载详解博客

🐇定义

  • 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
  • 实质就是函数重载。
  • operator是重载关键字。

🐇规则

  • C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。不能重载的运算符:
    • 成员访问运算符.
    • 成员指针访问运算符.*
    • 作用域运算符::
    • 长度运算符Sizeof
    • 条件运算符?:
  • 重载后运算符的优先级和结合性都不会改变。
  • 一般重载运算符后的意思与本意大致相同。
  • 重载不能改变操作数的个数。
  • 运算符重载函数的参数必须有一个是非c++标准类型,即至少有一个操作类型是自定义类型。
  • 类对象的运算符除=外都需要重载。

🐇友元运算符重载函数

  • 友元运算符重载函数是一种特殊的成员函数,它允许我们为一个类定义自定义的友元运算符操作。

  • 友元运算符重载函数的语法如下:

    friend 函数类型 operator 重载运算符 (形参表)
    {函数体;
    }
    
  • 友元运算符重载函数必须声明为类的友元函数。这样,它才能够访问类的私有成员。

  • 友元运算符重载函数没有隐式的 this 指针,因此不能直接访问类的成员变量和成员函数。但可以通过参数列表中的参数来访问类的对象。

  • 友元运算符重载函数通常定义在类的内部,但是使用 friend 关键字将其声明为友元函数。

  • 友元运算符重载函数可以实现任何自定义的运算符操作,例如加法、减法、乘法、除法等。

🐇成员运算符重载函数

  • 语法
    函数类型 operator 重载运算符(形参表)
    {函数体;
    }
    
  • 函数类型为此运算符的返回类型,可以不是类类型。
  • +=,-=等建议成员函数,其他建议友元。

📚虚函数

  • 类内声明函数类型前加virtual,定义时不用加。
  • 派生类中的虚函数的重新定义必须和基类中的一模一样,(函数与耐性,函数名,参数个数,参数类型顺序),否则会丢失虚特性。
  • 派生类中函数与基类中的虚函数一旦同名,则自动成为虚函数,所以关键字virtual可不加。
  • 派生类未对基类虚函数重新定义,则原样继承基类的虚函数,无论继承多少次,仍保持虚函数特性。
  • 虚函数不能是友元函数,不能是静态成员函数,因为虚函数需要特定的对象来激活。

📚纯虚函数和抽象类

  • virtual 函数类型 函数名(参数表)=0;
  • 即基类中不再给出实现部分只保留名字,因此不具备函数功能,不能被调用。
  • 有一个纯虚函数的类就叫做抽象类
    • 抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
    • 抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。
    • 只能做基类,不能声明基类对象。
    • 不能做参数类型,函数返回类型或显式转换类型,但可以声明基类型指针变量,由此可以指向派生类,实现动态联编。
    • 如果派生类中没有重新定义纯虚函数,那么派生类还是一个抽象类。

  1. 在类成员方法的声明(不是定义)语句前面加个单词virtual,它就会摇身一变成为虚函数。
  2. 在虚函数的声明语句未尾中加个 =0,它就会摇身一变成为纯虚函数。
  3. 子类可以重新定义基类的虚函数,我们把这个行为称之为复写(override)。
  4. 不管是虚函数还是纯虚函数,基类均可为其提供实现代码(implementation),在这种情况下子类可以调用基类的这些实现。
  5. 子类自主选择是否要提供一份属于自己的个性化虚函数实现。
  6. 子类必须提供一份属于自己的个性化纯虚函数实现。

👀在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?

  • 在C++中,不能声明虚构造函数,多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的;
  • 可以声明虚析构函数,析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数针对不同的对象进行清理工作。

👀群体类和群体数据的组织(主要是template模板)相关博客补充

  • 清华大学C++课程学习笔记
  • C++中的函数模板
  • C++中的类模板

相关文章:

高程 | 多态性(c++)

文章目录 📚多态📚运算符重载🐇定义🐇规则🐇友元运算符重载函数🐇成员运算符重载函数 📚虚函数📚纯虚函数和抽象类 📚多态 多态:同样的消息被不同类型的对象…...

LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装 Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。 MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备…...

[uniapp生命周期]详细讲解uniapp中那些属于vue生命周期,那些属于uniapp独有的生命周期,以及这中间的区别 相关的内容和api 代码注释

目录 1. Vue.js生命周期函数2.Vue生命周期函数代码beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed$nextTick$forceUpdate$destroy 3. UniApp独有的生命周期函数onLaunchonShowonHideonError 4.总结 在UniApp中,除了Vue.js的生命周…...

【动态规划】【记忆化搜索】【状态压缩】1681. 最小不兼容性

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 状态压缩 记忆化搜索 1681. 最小不兼容性 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中,使得同一…...

JVM-类加载器 双亲委派机制

申明:文章内容是本人学习极客时间课程所写,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。 什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写&a…...

vue axios 请求后端无法传参问题

vue请求后端无法传参问题 问题描述处理过程总结 问题描述 在学习vue时,使用axios调用后端,发现无法把参数正确传到后端,现象如下: 使用vue发起请求,浏览器上已经有传参,但是后端没接收到对应的用户名密码&…...

打印最小公倍数

打印最小公倍数 题目描述: 输入2个整数m和n,计算m和n的最小公倍数,并打印出结果 测试1: 输入:18 24 输出:72 测试2: 输入:18 6 输出:18解法思路: 最小公倍数是指两个…...

[AIGC] Java 和 Kotlin 的区别

好的,我还是以“萌萌哒小码农”的身份继续回答您的问题。 Java 和 Kotlin 是两种不同的编程语言,它们有许多共同点,但也有一些重要的区别。以下是一些常见的 Java 和 Kotlin 的区别: 语法 Kotlin 的语法比 Java 简洁得多&#…...

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充:定时器 3.超声波的接收与计时 4.距离的计算 1)定时器1为16位自动重载+1T11.0592MHz 2)定时器1为16位自动重载&am…...

前端架构: 脚手架开发流程中的难点梳理

脚手架的开发流程 1 )开发流程 创建 npm 项目创建脚手架入口文件,最上方添加: #!/usr/bin/env node 配置 package.json, 添加 bin 属性编写脚手架代码将脚手架发布到 npm 2 )使用流程 安装脚手架 npm install -g your-own-cli …...

django中配置使用websocket

Django 默认情况下并不支持 WebSocket,但你可以通过集成第三方库如 channels 来实现 WebSocket 功能。channels 是一个 Django 应用,它提供了对 WebSocket、HTTP2 和其他协议的支持。 下面是如何在 Django 项目中使用 WebSocket 的基本步骤:…...

Rust复合类型详解

在Rust中,复合类型是一种能够将多个值组合在一起的数据类型。本篇博客将介绍两种常见的复合类型:元组(Tuple)和数组(Array)。 Tuple(元组) 元组是Rust中的一种复合类型&#xff0c…...

学习 JavaScript 闭包

1. 前言 闭包是 JavaScript 中一种非常重要的概念,它允许函数访问其外部作用域中的变量,即使在函数被返回或者在其原始定义的作用域之外执行时仍然可以访问这些变量。 在讲解闭包之前我们得弄清楚下面的概念: 作用域链: JavaSc…...

VScode中配置 C/C++ 环境 | IT拯救者

文章目录 0 引言1. 下载编辑器VScode2. 下载编译器MinGW并解压3. 将MinGW添加至环境变量4. 配置VScode插件5. 运行代码6. 调整和优化7. 提示8. 例行格式条款9. 例行格式条款 0 引言 由于VScode毛毛张使用不习惯,因此配置教程记不住,不过毛毛张看到一篇不…...

基于Python实现Midjourney集成到(个人/公司)平台中

目前Midjourney没有对外开放Api,想体验他们的服务只能在discord中进入他们的频道进行体验或者把他们的机器人拉入自己创建的服务器中;而且现在免费的也用不了了,想使用就得订阅。本教程使用midjourney-api这个开源项目,搭建Midjou…...

蓝桥杯刷题--python-6

0最大距离 - 蓝桥云课 (lanqiao.cn) n=int(input()) nums=list(map(int,input().split()))max_=float(-inf) for i in range (n):for j in range (i+1,n):tmp=abs(i-j)+abs(nums[i]-nums[j])max_=max(tmp,max_) print(max_) 0最长递增 - 蓝桥云课 (lanqiao.cn) import os im…...

node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查

文章目录 ⭐前言⭐ 功能设计与实现💖 node后端操作数据库实现增删改查💖 vue3前端实现增删改查⭐ 效果⭐ 总结⭐ 结束⭐结束⭐前言 大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查。 技术选型 前端:vite+vue3+antd 后端:…...

【Android】使用Apktool反编译Apk文件

文章目录 1. 下载Apktool1.1 Apktool官网下载1.2 百度网盘下载 2. 安装Apktool3. 使用Apktool3.1 配置Java环境3.2 准备Apk文件3.3 反编译Apk文件3.3.1 解包Apk文件3.3.2 修改Apk文件3.3.3 打包Apk文件3.3.4 签名Apk文件 1. 下载Apktool 要使用Apktool,需要准备好 …...

(04)Hive的相关概念——order by 、sort by、distribute by 、cluster by

Hive中的排序通常涉及到order by 、sort by、distribute by 、cluster by 一、语法 selectcolumn1,column2, ... from table [where 条件] [group by column] [order by column] [cluster by column| [distribute by column] [sort by column] [limit [offset,] rows]; …...

Django模板(二)

标签if 标签在渲染过程中提供使用逻辑的方法,比如:if和for 标签被 {% 和 %} 包围,如下所示: 由于在模板中,没有办法通过代码缩进判断代码块,所以控制标签都需要有结束的标签 if判断标签{% if %} {% endif %} : # athlete_list 不为空 {% if athlete_list %}# 输出 ath…...

OpenClaw创始人加入OpenAI:这不是跳槽新闻,是整个AI行业换挡的信号

OpenClaw创始人加入OpenAI:这不是跳槽新闻,是整个AI行业换挡的信号摘要OpenClaw创始人Peter Steinberger正式加入OpenAI,项目移交开源基金会。Sam Altman亲自官宣,称他是"天才"。这件事的真正意义不在人事变动&#xff…...

intv_ai_mk11开源模型教程:7B Llama架构对话机器人在GPU云上的安全沙箱实践

intv_ai_mk11开源模型教程:7B Llama架构对话机器人在GPU云上的安全沙箱实践 1. 什么是intv_ai_mk11对话机器人 intv_ai_mk11是一个基于7B参数Llama架构的AI对话助手,专门设计运行在GPU云服务器环境中。这个模型经过优化,能够在保持较高响应…...

seo实用工具对网站长期发展有什么影响

SEO实用工具对网站长期发展的影响 在当今数字化时代,网站的长期发展离不开搜索引擎优化(SEO)。而SEO实用工具,则是推动网站长期发展的重要助手。它们不仅帮助提升网站的搜索排名,还能够提供数据分析、关键词研究和竞争…...

使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例

使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例 最近在尝试用大模型来理解一些复杂的系统交互逻辑,发现了一个挺有意思的用法。我们团队在测试Cosmos-Reason1-7B时,没有让它写代码或者生成文案,而是给了它一个更“…...

从Solid模块到轨迹规划:一个完整机械臂SimMechanics仿真项目的保姆级拆解

从Solid模块到轨迹规划:一个完整机械臂SimMechanics仿真项目的保姆级拆解 机械臂仿真一直是工业自动化和机器人研究中的核心课题。不同于传统Adams等专业仿真软件,SimMechanics凭借其与Matlab/Simulink的无缝集成,为工程师提供了从建模到控制…...

【软考高项】需求跟踪矩阵在项目全生命周期中的关键作用与实践指南

1. 需求跟踪矩阵:项目管理的"导航仪" 刚入行做项目经理那会儿,我最怕的就是需求变更。明明已经确认好的需求,开发到一半客户突然说要改,整个团队手忙脚乱地翻文档、改代码、调测试用例,最后交付时还是漏了几…...

GPIO输出模式详解:推挽与开漏对比与应用

1. GPIO输出模式基础概念在嵌入式系统开发中,GPIO(General Purpose Input/Output)是最基础也是最常用的外设之一。作为硬件工程师,深入理解GPIO的不同工作模式对于电路设计和程序开发都至关重要。今天我们就来详细剖析GPIO的两种主要输出模式&#xff1a…...

VideoSrt:零基础视频字幕自动化解决方案

VideoSrt:零基础视频字幕自动化解决方案 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 视频创作者的效率痛点&#xff1a…...

如何免费将OFD转PDF?Ofd2Pdf完整使用指南

如何免费将OFD转PDF?Ofd2Pdf完整使用指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否经常收到OFD格式的文件却无法打开?无论是电子发票、政府公文还是企业文档&…...

无损视频剪辑终极指南:如何用LosslessCut保持原始画质快速编辑

无损视频剪辑终极指南:如何用LosslessCut保持原始画质快速编辑 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在视频编辑的世界里,质量与速度…...