C++三大特征:多态

1.virtual关键字

1.1何为虚函数

virtual用于在base类中声明一个虚函数,[虚函数]的主要作用是[允许]在派生类(也称为子类)中对该函数进行[重写](override)

1.2何为重写

重写就是在drived类中写一个函数(返回类型,名称,参数列表)与base类相同的函数,drived类中的这个函数是会覆盖base类中的这个函数

虚函数和重写之间的关系

二者联系∶如果base类中有一个函数允许被重写,那么这个函数就是虚函数,在函数调用时,可以形成多态

2.组合

何为组合:简而言之,就是在一个class中复用另外一个class

ps:优先使用组合,而不是继承

原因:

组合是一种黑箱复用,继承是一种白箱复用,相对于黑盒,白盒对技术的要求更高//软件工程中,认为类与类之间的耦合度越低越好,

如果两个类之间是继承关系且耦合度较高,那么有一个类要改,那么后面一连串的类都需要更改

/重写和虚函数是紧密相连的,要重写再去写虚函数

3.多态

3.1 多态基础概念:

根据百度的释义如下:多态(Polymorphism)是编程语言和类型论中的一个重要概念,它指为不同数据类型的实体提供统一的接口。多态类型(Polymorphic Type)可以将自身所支持的操作套用到其他类型的值上。在面向对象编程(OOP)中,多态允许不同的对象对同一消息(即方法调用)做出不同的响应,这种能力通过继承和接口实现,提高了代码的灵活性和可扩展性。

顾名思义:多态就是多种状态

形象来讲就是不同类的对象进行相同的活动得到不同的结果

打个比方不同的人(可分为欧皇类和非酋类)去抽卡,他们的结果是有人200抽一井吃满,有人十发便拿下当期SSR风格角色

3.2 虚函数,重写在多态中的作用

虚函数一定要去重写,虚函数嘛,放在那里都虚拟的,虚拟的事物是不好用的,所以需要我们去重写一下

重写和虚函数是紧密相连的,要重写再去写虚函数

3.3多态案例展示

代码

class Person
{
public:virtual void BuyTicket(){cout << "全价票" << endl;}
};class Student :public Person {
public://重写,可以不写virtual,但是建议加上virtual void BuyTicket(){cout << "半价票" << endl;}
};//多态的条件
//1.虚函数重写
//2.基类指针或者使用基类引用void Func(Person& object)
{object.BuyTicket();//动态绑定:多态的特点是指向谁调用谁,
}//void Func(Person* object)
//{
//	object->BuyTicket();
//	//动态绑定:多态的特点是指向谁调用谁,
//}//不同的对象使用相同的动作得出不同的结果
int main()
{Person p;//对象p调用base类,Person类型的Student s;//对象s调用drived类,Student类型的Func(&p);Func(&s);return 0;}

4.隐藏和重写之间的区别

隐藏只要派生类中的成员和基类中的成员名称相同就好了

而重写派生类的函数名之前是要加上virtual的

4.1隐藏

4.2重写

4.3 有关析构函数的重写

Q:析构函数是否建议设计成虚函数

A:析构函数在基类中一定要设计成虚函数,析构函数的名称最终会被编译器改成destruct

5. 有关关键字override和final

5.1 override

作用:用于编译时检查派生类重写函数是否成功

5.2 final

作用:

a. 修饰一个类时候可以阻止这个类被继承

b.修饰一个虚函数时可以阻止这个虚函数被重写

6. 重写,重载,重定义三者间的区别

重载:函数名相同:参数列表不同

复写(覆盖) :两个函数分别在基类和派生类,函数名/参数/返回值必须相同,两个函数都必须是虚函数

重定义(隐藏) :两个函数分别在基类和派生类中,函数名相同,两个基类和派生类不构成重写就是重定义

7.抽象类

纯虚函数:在虚函数后面加上" =0 "
一个类型在现实中没有实体对象,不想实例化出对象,可以设计成抽象类
抽象类:包含纯虚函数的类就是抽象类,抽象类不能实例化出对象、

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

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

相关文章

C++基础(二)

目录 1.类和对象 1.1类的定义 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.类的默认成员函数 4.1构造函数 4.2析构函数 4.5运算符重载 1.类和对象 1.1类的定义 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&…

从零开始实现大语言模型(四):简单自注意力机制

1. 前言 理解大语言模型结构的关键在于理解自注意力机制(self-attention)。自注意力机制可以判断输入文本序列中各个token与序列中所有token之间的相关性&#xff0c;并生成包含这种相关性信息的context向量。 本文介绍一种不包含训练参数的简化版自注意力机制——简单自注意…

uni-app/vue项目如何封装全局消息提示组件

效果图&#xff1a; 第一步&#xff1a;封装组件和方法&#xff0c;采用插件式注册&#xff01; 在项目目录下新建components文件夹&#xff0c;里面放两个文件&#xff0c;分别是index.vue和index.js. index.vue&#xff1a; <template><div class"toast&quo…

【Linux杂货铺】2.进程优先级

1.进程优先级基本概念 进程优先级是操作系统中用于确定进程调度顺序的一个指标。每个进程都会被分配一个优先级&#xff0c;优先级较高的进程会在调度时优先被执行。进程优先级的设定通常根据进程的重要性、紧急程度、资源需求等因素来确定。操作系统会根据进程的优先级来决定进…

nuPlan 是一个针对自动驾驶车辆的闭环机器学习(ML-based)规划基准测试

nuPlan: A closed-loop ML-based planning benchmark for autonomous vehicles nuPlan 是一个针对自动驾驶车辆的闭环机器学习&#xff08;ML-based&#xff09;规划基准测试 Abstract In this work, we propose the world’s first closed-loop ML-based planning benchmar…

【JavaScript】解决 JavaScript 语言报错:Uncaught ReferenceError: XYZ is not defined

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 变量未声明2. 拼写错误3. 块级作用域4. 使用未定义的函数或对象5. 代码执行顺序 四、解决方案与预防措施1. 确保变量已声明2. 检查拼写错误3. 注意块级作用域4. 定义和调用函数5. 正确的代码执行顺序 五、示…

tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器

引言 在TinUIXml简易编辑器中&#xff0c;我们通过TinUI搭建了一个简易的针对TinUIXml布局的编辑器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的导入与导出。现在&#xff0c;就在此基础上&#xff0c;对编辑器进行升级。 本次升级的功能&#xff1a; 更合理的xml编辑与…

Java设计模式---(创建型模式)工厂、单例、建造者、原型

目录 前言一、工厂模式&#xff08;Factory&#xff09;1.1 工厂方法模式&#xff08;Factory Method&#xff09;1.1.1 普通工厂方法模式1.1.2 多个工厂方法模式1.1.3 静态工厂方法模式 1.2 抽象工厂模式&#xff08;Abstract Factory&#xff09; 二、单例模式&#xff08;Si…

浅析Kafka-Stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

【密码学】大整数分解问题和离散对数问题

公钥密码体制的主要思想是通过一种非对称性&#xff0c;即正向计算简单&#xff0c;逆向计算复杂的加密算法设计&#xff0c;来解决安全通信。本文介绍两种在密码学领域内最为人所熟知、应用最为广泛的数学难题——大整数分解问题与离散对数问题 一、大整数分解问题 &#xf…

thinkphp 生成邀请推广二维码,保存到服务器并接口返回给前端

根据每个人生成自己的二维码图片,接口返回二维码图片地址 生成在服务器的二维码图片 控制器 public function createUserQRcode(){$uid = input(uid);if

传言称 iPhone 16 Pro 将支持 40W 快速充电和 20W MagSafe

目前&#xff0c;iPhone 15 和 iPhone 15 Pro 机型使用合适的 USB-C 电源适配器可实现高达 27W 的峰值充电速度&#xff0c;而 Apple 和授权第三方的官方 MagSafe 充电器可以高达 15W 的功率为 iPhone 15 机型进行无线充电。所有四款 iPhone 15 机型均可使用 20W 或更高功率的电…

FPGA学习笔记(一) FPGA最小系统

文章目录 前言一、FPGA最小系统总结 前言 今天学习下FPGA的最小系统一、FPGA最小系统 FPGA最小系统与STM32最小系统类似&#xff0c;由供电电源&#xff0c;时钟电路晶振&#xff0c;复位和调试接口JTAG以及FLASH配置芯片组成&#xff0c;其与STM32最大的不同之处就是必须要有…

Appium自动化测试系列: 2. 使用Appium启动APP(真机)

历史文章&#xff1a;Appium自动化测试系列: 1. Mac安装配置Appium_mac安装appium-CSDN博客 一、准备工作 1. 安卓测试机打开调试模式&#xff0c;然后使用可以传输数据的数据线连接上你的电脑。注意&#xff1a;你的数据线一定要支持传输数据&#xff0c;有的数据线只支持充…

《数据结构:C语言实现顺序表》

文章目录 一、顺序表1、静态顺序表2、动态顺序表 二、动态顺序表实现1、创建自定义类型2、完成顺序表的创建&#xff0c;测试功能需求3、完成顺序表的初始化和销毁功能4、顺序表插入数据和打印数据5、删除数据 三、顺序表完成最终的代码test.c文件中的代码&#xff1a;用来测试…

新手教学系列——MongoDB聚合查询的进阶用法

引言 MongoDB的聚合查询是其最强大的功能之一。无论是汇总、平均值、计数等标准操作,还是处理复杂的数据集合,MongoDB的聚合框架都能提供高效且灵活的解决方案。本文将通过几个实例,详细讲解如何在实际项目中使用MongoDB进行聚合查询。 标准应用:汇总、平均值、计数等 在…

k8s集群部署mysql8主备

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 动态存储类自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…

Neo4j安装

下载地址&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk&#xff0c;Neo4j 3.0需要jdk8&#xff0c;2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2&#xff0c;对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…

【机器学习】朴素贝叶斯算法详解与实战扩展

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 朴素贝叶斯算法是一种基于概率统计的分类方法&#xff0c;它利用贝叶斯定理和特征条件独立假设来预测样本的类别。尽管其假设特征之间相互独立在现实中往往不成立&#xff0c;但朴素贝叶斯分类器因其计算…

卤味江湖中,周黑鸭究竟该抓住什么赛点?

近年来&#xff0c;卤味江湖的决斗从未停止。 随着休闲卤味、佐餐卤味等细分赛道逐渐形成&#xff0c;“卤味三巨头”&#xff08;周黑鸭、绝味食品、煌上煌&#xff09;的牌桌上有了更多新对手&#xff0c;赛道变挤了&#xff0c;“周黑鸭们”也到了转型关键期。 这个夏天&a…