C++(9) 虚函数
文章目录
- 虚函数
- 1. 虚函数
- 1.1 虚函数案例1
- 1.2 虚函数案例2
- 1.2 纯虚函数
- 1.3 纯虚函数语法要求总环
- 1.4 纯虚函数应用
- 1.4.1 生活案例
- 1.4.2 虚函数引用代码
虚函数
1. 虚函数
1.1 虚函数案例1
#include <iostream>using namespace std;class Animal
{
public:// Animal 类内 eat 函数加入的 virtual 修饰virtual void eat() { cout << "动物吃饭" << endl; }
};class Dog : public Animal
{
public:void eat() { cout << "Dog 吃饭" << endl; }
};
class Cat : public Animal
{
public:void eat() { cout << "Cat 吃饭" << endl; }
};
class Bird : public Animal
{
public:void eat() { cout << "Bird 吃饭" << endl; }
};// 当前函数所需类型为 Animal 类型
void test_eat(Animal *a);int main(int argc, char const *argv[])
{Animal *a = new Animal;Dog *dog = new Dog;Cat *cat = new Cat;Bird *bird = new Bird;/*test_eat 函数可以使用 dog cat 和 bird 作为实际参数【注意】当前函数所需参数为 Animal 类型,使用 dog cat 和 bird 作为实际参数是符合开发要求的,因为 dog cat 和 bird 都是 Animal 的子类,可以看作是【Animal】类型从某种意义上来说,dog cat 和 bird 都是 Animal 类型【知识点】函数参数为父类类型,可以使用父类本身或者子类作为函数的实际参数*/ test_eat(dog);test_eat(cat);test_eat(bird);return 0;
}void test_eat(Animal *a)
{/*当前情况下,使用子类作为当前函数的参数,可以执行对应的代码,单数执行的内容是 Animal 内容,非对应子类内容因为对于编译器而言,a 是 Animal 类型,编译器会首先选择调用Animal 类当前中的 eat 函数期望的是:传入的具体数据类型,也就是子类的函数被执行父类的指针指向子类的对象,并且想调用子类的函数,这个操作很 virtual父类函数没有 virtual 修饰之前动物吃饭动物吃饭动物吃饭父类函数使用 virtual 修饰之后Dog 吃饭Cat 吃饭Bird 吃饭编译器根据【真实类型】调用目标函数*/a->eat();
}
1.2 虚函数案例2
#include <iostream> using namespace std;class Base
{
public:virtual void test() { cout << "Base 类 test 函数" << endl; }
};class Sub : public Base
{
public:void test() { cout << "Sub 类 test 函数" << endl; }
};int main(int argc, char const *argv[])
{Base * b = new Sub;b->test();delete b;return 0;
}
1.2 纯虚函数
#include <iostream> using namespace std;class Base
{
public:/*virtual 修饰的虚函数,存在函数体,子类通过继承之后,得到当前函数内容,并且执行使用*/virtual void test() { cout << "虚函数" << endl; }/*【纯】虚函数1. 使用 virtual 修饰2. 函数有且只有声明3. 函数声明之后又 = 0 操作,特定格式!告知编译器当前函数没有函数体,只有函数声明!*/virtual void test_pure() = 0;
};/*
Sub 是 Base 类中的一个子类,继承 Base 类中的 public 和 protected 修饰内容
当前 Sub 从 Base 类中获取到virtual void test() {......} 存在函数体virtual void test_pure() = 0; 没有函数体的虚函数提示报错:
不允许使用抽象类类型 "Sub" 的对象:C/C++(322)
02_纯虚函数.cpp(42, 18): 纯虚拟 函数 "Base::test_pure" 没有强制替代项报错中可以获取到的信息:1. 一个类内存在【纯虚函数】,当前类 C++ 认为是一个【抽象 abstract 类】2. 纯虚函数没有函数体,如果实例化对象想要调用纯虚函数,语法错误,所有编译器前置语法报错告知【纯虚拟 函数 "Base::test_pure" 没有强制代替项】理解为:子类继承父类的纯虚函数,需要【实现/完成函数体】*/
class Sub : public Base
{
public:void test_pure() { cout << "子类【强制】实现纯虚函数" << endl; }
};int main(int argc, char const *argv[])
{Sub *m = new Sub;m->test();m->test_pure();delete m;return 0;
}
1.3 纯虚函数语法要求总环
- 纯虚函数没有函数体,只有函数声明和特定的 = 0 格式
- 纯虚函数所在的类,是一个【抽象 abstract 类】
- 抽象无法进行实例化操作。因为抽象类有纯虚函数没有函数体,实例化对象无法调用,所有语法前置报错,提示不能实例化
- 子类继承抽象类,如果实现抽象类中的纯虚函数,子类不再是一个抽象类,如果未实现,还是一个抽象类
1.4 纯虚函数应用
1.4.1 生活案例

1.4.2 虚函数引用代码
#include <iostream>using namespace std;// Base 是一个【抽象类】
class Base
{
public:// 使用【纯虚函数】制定函数实现规则,限制【函数三要素:返回值类型、函数名、形式参数列表】virtual void boil() = 0;virtual void make_tea() = 0;virtual void add_spices() = 0;virtual void seal_cup() = 0;
};/*
通用的 Base.实现 Base 抽象类中部分函数泡茶喝添加小料操作尚未实现,具备一定的【特征性和唯一性】
*/
class GenericBase : public Base
{
public:virtual void boil() { cout << "纯净水烧制 100 ° " << endl; }virtual void seal_cup() { cout << "自动封杯机工作" << endl; }
};/*
【实现类】具备一定的特征性和使用性
*/
class BYJX : public GenericBase
{
public: BYJX() { name = "伯牙绝弦"; }void make_tea() { cout << "茉莉花茶" << endl; }void add_spices() { cout << "牛乳" << endl; }string getName() { return name; } private:string name;
};class QGPE : public GenericBase
{
public:QGPE() { name = "青柑普洱"; }void make_tea() { cout << "青柑普洱" << endl; }void add_spices() { cout << "三分糖" << endl; }string getName() { return name; }
private: string name;
};class GreenTea : public GenericBase
{
public:GreenTea() { name = "绿茶"; }void make_tea() { cout << "信阳毛尖" << endl; }void add_spices() { cout << "三分糖" << endl; }string getName() { return name; }private: string name;
};class Frappuccino : public GenericBase
{
public:Frappuccino() { name = "摩卡可可碎星冰乐"; }void boil() { cout << "常温纯净水" << endl; }void make_tea() { cout << "咖啡" << endl; }void add_spices() { cout << "摩卡酱 + 可可碎" << endl; }void seal_cup() { cout << "自动封杯机工作" << endl; }string getName() { return name; }
private:string name;
};int main(int argc, char const *argv[])
{BYJX *b = new BYJX;b->boil(); // 纯净水烧制 100 ° b->make_tea(); // 茉莉花茶b->add_spices(); // 牛乳b->seal_cup(); // 自动封杯机工作cout << b->getName() << endl; // 伯牙绝弦cout << "------------------------" << endl;QGPE *q = new QGPE;q->boil(); // 纯净水烧制 100 ° q->make_tea(); // 青柑普洱q->add_spices(); // 三分糖q->seal_cup(); // 自动封杯机工作cout << q->getName() << endl; // 青柑普洱cout << "------------------------" << endl;GreenTea *g = new GreenTea;g->boil(); // 纯净水烧制 100 ° g->make_tea(); // 信阳毛尖g->add_spices(); // 三分糖g->seal_cup(); // 自动封杯机工作cout << g->getName() << endl; // 绿茶cout << "------------------------" << endl;Frappuccino *f = new Frappuccino;f->boil(); // 纯净水烧制 100 ° f->make_tea(); // 咖啡f->add_spices(); // 摩卡酱 + 可可碎f->seal_cup(); // 自动封杯机工作cout << f->getName() << endl; // 摩卡可可碎星冰乐delete b;delete q;delete g;delete f;return 0;
}
----------------------" << endl;Frappuccino *f = new Frappuccino;f->boil(); // 纯净水烧制 100 ° f->make_tea(); // 咖啡f->add_spices(); // 摩卡酱 + 可可碎f->seal_cup(); // 自动封杯机工作cout << f->getName() << endl; // 摩卡可可碎星冰乐delete b;delete q;delete g;delete f;return 0;
}
相关文章:
C++(9) 虚函数
文章目录 虚函数1. 虚函数1.1 虚函数案例11.2 虚函数案例21.2 纯虚函数1.3 纯虚函数语法要求总环1.4 纯虚函数应用1.4.1 生活案例1.4.2 虚函数引用代码 虚函数 1. 虚函数 1.1 虚函数案例1 #include <iostream>using namespace std;class Animal { public:// Animal 类…...
uniapp 使用canvas 画海报,有手粘贴即可用(拆成组件了,看后面)
1.直接使用 html部分 <view click"doposter">下载海报</view> <canvas canvas-id"myCanvas" type2d style"width: 370px; height: 550px;opcity:0;position: fixed;z-index:-1;" id"myCanvas" />js 部分 drawBac…...
Amazon Bedrock 的微调和持续预训练功能允许用户使用私有数据定制模型
今天我很高兴地宣布,您现在可以在 Amazon Bedrock 中使用自己的数据,安全并私密地定制基础模型(FMs),按照您所在领域、企业和用例的特定要求构建应用程序。借助定制模型,您可以创建独特的用户体验ÿ…...
Pyecharts绘制多种炫酷气泡图
Pyecharts绘制多种炫酷气泡图 引言 数据可视化是数据分析中不可或缺的一环,而Pyecharts作为一款基于Echarts的Python图表库,提供了丰富的图表类型,其中气泡图是一种常用于展示三维数据的炫酷图表。本文将介绍如何使用Pyecharts绘制多种炫酷…...
C# 多线程(2)——线程同步
目录 1 线程不安全2 线程同步方式2.1 简单的阻塞方法2.2 锁2.2.1 Lock使用2.2.2 互斥体Mutex2.2.3 信号量Semaphore2.2.3 轻量级信号量SemaphoreSlim2.2.4 读写锁ReaderWriterLockSlim 2.3 信号同步2.3.1 AutoResetEvent2.3.1.1 AutoResetEvent实现双向信号 2.3.2 ManualResetE…...
Java设计模式【工厂模式】
Java设计模式【工厂模式】 前言 三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式; 创建型设计模式封装对象的创建过程,将对象的创建和使用分离开,从而提高代码的可维护性和可扩展性 简单工厂模式 概述:将…...
AI智能分析+明厨亮灶智慧管理平台助力“舌尖上的安全”
春节是中国最重要的传统节日之一,在春节期间,人们聚餐需求激增,餐饮业也迎来了高峰期。在这个时期,餐饮企业需要更加注重食品安全和卫生质量,以保证消费者的健康和权益,明厨亮灶智慧管理成为了餐饮业中备受…...
【现代密码学基础】详解完美安全与香农定理
目录 一. 介绍 二. 完美安全的密钥与消息空间 三. 完美安全的密钥长度 四. 最优的完美安全方案 五. 香农定理 (1)理论分析 (2)严格的正向证明 (3)严格的反向证明 六. 小结 一. 介绍 一次一密方案…...
Python 将文本转换成语音播放 pyttsx3
Python 将文本转换成语音播放 pyttsx3 目录 Python 将文本转换成语音播放 pyttsx3 1. 安装 2. 使用 3. 封装 Pyttsx3 是一个 Python 库,它提供了文本到语音(Text-to-Speech,TTS)转换的功能。这个库允许 Python 程序通过调用本…...
FPGA高端项目:Xilinx Artix7系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持
目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本 3、设计思路框架设计框图…...
开源模型应用落地-业务优化篇(三)
一、前言 假如您跟随我的脚步,学习到上一篇的内容,到这里,相信细心的您,已经发现了,在上一篇中遗留的问题。那就是IM服务过载的时候,如何进行水平扩容? 因为在每个IM服务中,我们用JV…...
基于SpringBoot+Vue实现的物流快递仓库管理系统
基于SpringBootVue实现的物流快递仓库管理系统 文章目录 基于SpringBootVue实现的物流快递仓库管理系统系统介绍技术选型成果展示账号地址及其他说明源码获取 系统介绍 系统演示 关注视频号【全栈小白】,观看演示视频 基于SpringBootVue实现的物流快递仓库管理系…...
编程笔记 html5cssjs 072 JavaScrip BigInt数据类型
编程笔记 html5&css&js 072 JavaScrip BigInt数据类型 一、BigInt 数据类型二、BigInt 的创建和使用三、BigInt 操作与方法三、示例小结 JavaScript BigInt 数据类型是一种内置的数据类型,用于表示大于 Number.MAX_SAFE_INTEGER(即2^53 - 1&…...
matlab simulink 步进电机控制
1、内容简介 略 41-可以交流、咨询、答疑 2、内容说明 电动执行器定位控制在生产生活中具有广泛的应用,在使用搭载步进电机的电动执行器进行定位控制的时候,定位系统的定位精度和响应波形,会随着负载质量的变化而变化,这是由电…...
使用阿里云的IDaaS实现知行之桥EDI系统的单点登录
,在开始测试之前,需要确定用哪个信息作为“登陆用户的ID字段”。 这个字段用来在完成SSO登陆之后,用哪个信息将阿里云IDaaS的用户和知行之桥EDI系统的用户做对应。这里我们使用了 phonenumber 这个自定义属性。需要在阿里云做如下配置&#x…...
基于微服务的高考志愿智能辅助决策系统(附源码)
目录 一.引言 1、编写目的 2、系统功能概述 二.功能分析 三.微服务模块 1、微服务用户相关模块 (1)用户注册 (2)用户登录 (3)用户信息管理 (4)用户操作 2、微服务文件云存…...
LeetCode —— 137. 只出现一次的数字 II
😶🌫️😶🌫️😶🌫️😶🌫️Take your time ! 😶🌫️😶🌫️😶🌫️😶🌫️…...
pnpm、npm、yarn 包管理工具
1、npm 关键词:软件包管理器、命令行工具、一个社区和一个平台 npm(Node Package Manager)是一个用于Node.js环境的软件包管理器。它是一个命令行工具,用于安装、升级、删除和管理JavaScript软件包。npm最初是随同Node.js一起发布…...
微服务知识
1、概念 大型单体应用拆分成多个独立部署运行的微服务(解决并发问题) 2、特点 3、技术栈 4、微服务带来的问题 5、微服务的注册中心 服务注册与发现:微服务实例在启动时会向注册中心注册自己的信息…...
如何在微信搭建私域流量池?
A: ①给客户打标签 添加标签,多维度构建用户画像,精准发送消息。 ②群发信息 选择自定义时间,上传内容 (支持文字,图片) ,一键群发 。 ③建立专属素材库 将常用的话术、图片与文件录入至素材库,员工可随…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
