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: ①给客户打标签 添加标签,多维度构建用户画像,精准发送消息。 ②群发信息 选择自定义时间,上传内容 (支持文字,图片) ,一键群发 。 ③建立专属素材库 将常用的话术、图片与文件录入至素材库,员工可随…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...