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: ①给客户打标签 添加标签,多维度构建用户画像,精准发送消息。 ②群发信息 选择自定义时间,上传内容 (支持文字,图片) ,一键群发 。 ③建立专属素材库 将常用的话术、图片与文件录入至素材库,员工可随…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
