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

C++ 虚函数与纯虚函数

 

目录

1. 虚函数

2. 纯虚函数


C++ 中的虚函数和纯虚函数都是实现多态的重要机制。多态可以让不同的对象以相同的方式进行操作,从而简化代码的编写和维护。

1. 虚函数

        虚函数是一种在基类中声明的函数,可以在派生类中进行重写。在运行时,根据对象的类型确定调用的函数版本,这就是所谓的动态绑定运行时多态
        在C++中,将一个成员函数声明为虚函数,只需要在函数声明前加上virtual关键字。如果在基类中声明了一个虚函数,派生类中的同名函数也将自动成为虚函数,除非显式地指定为非虚函数。
虚函数的一个重要作用实现运行时多态。在基类指针或引用指向派生类对象(方便统一接口)时,通过虚函数可以调用派生类中实现的版本,而不是基类中的版本。这种行为被称为虚函数重写(override),它可以让不同的对象以相同的方式进行操作。
举个栗子:

#include <iostream>using namespace std;class Shape {
public:virtual double area() const {return 0;}
};class Rectangle : public Shape {
public:Rectangle(double w, double h) : width(w), height(h) {}virtual double area() const {return width * height;}
private:double width, height;
};class Circle : public Shape {
public:Circle(double r) : radius(r) {}virtual double area() const {return 3.1415926 * radius * radius;}
private:double radius;
};int main() {Shape* shapes[] = {new Rectangle(3, 4), new Circle(2)};for (int i = 0; i < 2; i++) {cout << "Area: " << shapes[i]->area() << endl;}return 0;
}

        在这个示例中,我们定义了一个Shape基类,它包含一个虚函数area。Rectangle和Circle派生类分别重写了area函数,并实现了各自的面积计算方法。在main函数中,我们创建了一个Shape类型的指针数组,并将其指向两个不同类型的对象。通过调用虚函数area,我们可以使用相同的方式计算这两个对象的面积,而不必考虑它们的具体类型。(实现调用接口的统一,都用基类指针进行调用就行,因为基类定义了虚函数会自动生成一个虚函数指针指向虚函数表,子类的重写入口放在虚函数表中)

2. 纯虚函数

        纯虚函数是一种特殊的虚函数,它没有函数体需要在派生类中进行实现。定义纯虚函数的语法是在函数声明后面加上“=0”。包含纯虚函数的类被称为抽象类,不能实例化对象,只能用于派生其他类。

        纯虚函数的一个重要作用是定义接口。通过在基类中定义一组纯虚函数,可以明确指定子类必须实现的方法。这可以保证派生类的一致性,同时也可以简化代码的设计和维护。

举个栗子:

#include <iostream>using namespace std;class Shape {
public:virtual double area() const = 0;virtual void draw() const = 0;
};class Rectangle : public Shape {
public:Rectangle(double w, double h) : width(w), height(h) {}virtual double area() const {return width * height;}virtual void draw() const {cout << "Drawing a rectangle" << endl;}
private:double width, height;
};class Circle : public Shape {
public:Circle(double r) : radius(r) {}virtual double area() const {return 3.1415926 * radius * radius;}virtual void draw() const {cout << "Drawing a circle" << endl;}
private:double radius;
};int main() {Shape* shapes[] = {new Rectangle(3, 4), new Circle(2)};for (int i = 0; i < 2; i++) {cout << "Area: " << shapes[i]->area() << endl;shapes[i]->draw();}return 0;
}

        在这个示例中,我们在Shape基类中定义了两个纯虚函数area和draw。这个基类不能被实例化,只能被用于派生其他类。Rectangle和Circle派生类分别实现了area和draw函数,并实现了各自的面积计算方法和绘制方法。在main函数中,我们创建了一个Shape类型的指针数组,并将其指向两个不同类型的对象。通过调用纯虚函数area和draw,我们可以使用相同的方式计算这两个对象的面积并绘制它们,而不必考虑它们的具体类型。

        需要注意的是,纯虚函数必须在派生类中进行实现,否则派生类也将变成抽象类。如果在派生类中不想实现某个纯虚函数,可以将其声明为虚函数,并提供一个默认实现。这个默认实现可以是一个空函数体,也可以是一个具体的实现,具体的实现可能会在某些情况下有用。

        总之,虚函数和纯虚函数是C++中实现多态的重要机制。通过虚函数和纯虚函数,我们可以实现运行时多态和定义接口。这可以让不同的对象以相同的方式进行操作,从而简化代码的编写和维护。

参考:C++中虚函数和纯虚函数详解_c++ 虚函数和纯虚函数_不见白鹿的博客-CSDN博客

相关文章:

C++ 虚函数与纯虚函数

目录 1. 虚函数 2. 纯虚函数 C 中的虚函数和纯虚函数都是实现多态的重要机制。多态可以让不同的对象以相同的方式进行操作&#xff0c;从而简化代码的编写和维护。 1. 虚函数 虚函数是一种在基类中声明的函数&#xff0c;可以在派生类中进行重写。在运行时&#xff0c;根据对…...

警告:Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30

1. 警告 SpringBoot 的 validation 依赖包含有易受攻击的依赖 snakeyaml。 警告信息如下&#xff1a; Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30 意思是&#xff1a;提供了可传递的易受攻击依赖 maven:org.yaml:snakeyaml:1.30 2. 警告示例 …...

中文命名实体识别

本文通过people_daily_ner数据集&#xff0c;介绍两段式训练过程&#xff0c;第一阶段是训练下游任务模型&#xff0c;第二阶段是联合训练下游任务模型和预训练模型&#xff0c;来实现中文命名实体识别任务。 一.任务和数据集介绍 1.命名实体识别任务 NER&#xff08;Named En…...

WPF CommunityToolkit.Mvvm Messenger通讯

文章目录 环境WeakReferenceMessenger方法介绍无回调订阅发送Token区分有回调订阅发送 环境 CommunityToolkit.Mvvm Messenger 十月的寒流: 如何使用 CommunityToolkit.Mvvm 中的 Messenger 来进行 ViewModel 之间的通信 WeakReferenceMessenger 我这里只讲简单的弱Messenger…...

【杂言】写在研究生开学季

这两天搬进了深研院的宿舍&#xff0c;比中南的本科宿舍好很多&#xff0c;所以个人还算满意。受台风 “苏拉” 的影响&#xff0c;原本的迎新计划全部打乱&#xff0c;导致我现在都还没报道。刚开学的半个月将被各类讲座、体检以及入学教育等活动占满&#xff0c;之后又是比较…...

渗透测试漏洞原理之---【任意文件读取漏洞】

文章目录 1、概述1.1、漏洞成因1.2、漏洞危害1.3、漏洞分类1.4、任意文件读取1.4.1、文件读取函数1.4.2、任意文件读取 1.5、任意文件下载1.5.1、一般情况1.5.2、PHP实现1.5.3、任意文件下载 2、任意文件读取攻防2.1、路径过滤2.1.1、过滤../ 2.2、简单绕过2.2.1、双写绕过2.2.…...

合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)

图片 (Image) 图片IMG是用于显示图像的基本对象类型&#xff0c;图像来源可以是文件&#xff0c;或者定义的符号。 示例代码 -- 创建图片控件 img lvgl.img_create(lvgl.scr_act(), nil) -- 设置图片显示的图像 lvgl.img_set_src(img, "/lua/luatos.png") -- 图片…...

仿京东 项目笔记2(注册登录)

这里写目录标题 1. 注册页面1.1 注册/登录页面——接口请求1.2 Vue开发中Element UI的样式穿透1.2.1 ::v-deep的使用1.2.2 elementUI Dialog内容区域显示滚动条 1.3 注册页面——步骤条和表单联动 stepsform1.4 注册页面——滑动拼图验证1.5 注册页面——element-ui组件Popover…...

Spark与Flink的区别

分析&回答 &#xff08;1&#xff09;设计理念 1、Spark的技术理念是使用微批来模拟流的计算,基于Micro-batch,数据流以时间为单位被切分为一个个批次,通过分布式数据集RDD进行批量处理,是一种伪实时。 2、Flink是基于事件驱动的&#xff0c;是面向流的处理框架, Flink基于…...

未来智造:珠三角引领人工智能产业集群

原创 | 文 BFT机器人 产业集群是指产业或产业群体在地理位置上集聚的现象&#xff0c;产业集群的研究对拉动区域经济发展&#xff0c;提高区域产业竞争力具有重要意义。 从我国人工智能产业集群形成及区域布局来看&#xff0c;我国人工智能产业发展主要集聚在京津冀、长三角、…...

【Unity db】sqlite

背景 最近使用unity&#xff0c;需要用到sqlite&#xff0c;记录下使用过程 需要的动态库 Mono.Data.Sqlite.dll&#xff0c;这个文件下载参考下面链接 SqliteConnection的Close和Open 连接的概念&#xff1a; 在数据库编程中&#xff0c;连接是一个重要的概念&#xff0c…...

Linux 指令心法(四)`touch` 创建一个新的空文件

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 touch 是一个用于在 Linux 和 Unix 系统中创建空文件或更改现有文件的访问和修改时间的命令。如果指定的文件不存在&#xff0c;touch会创建一个新的空文件&a…...

分类算法系列②:KNN算法

目录 KNN算法 1、简介 2、原理分析 数学原理 相关公式及其过程分析 距离度量 k值选择 分类决策规则 3、API 4、⭐案例实践 4.1、分析 4.2、代码 5、K-近邻算法总结 &#x1f343;作者介绍&#xff1a;准大三网络工程专业在读&#xff0c;努力学习Java&#xff0c;涉…...

12. 微积分 - 梯度积分

Hi,大家好。我是茶桁。 上一节课,我们讲了方向导数,并且在最后留了个小尾巴,是什么呢?就是梯度。 我们再来回看一下但是的这个式子: [ f x f y...

Large Language Models and Knowledge Graphs: Opportunities and Challenges

本文是LLM系列的文章&#xff0c;针对《Large Language Models and Knowledge Graphs: Opportunities and Challenges》的翻译。 大语言模型和知识图谱&#xff1a;机会与挑战 摘要1 引言2 社区内的共同辩论点3 机会和愿景4 关键研究主题和相关挑战5 前景 摘要 大型语言模型&…...

Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 xlwings模块详解 1、快速入门1、打开Excel2、创建工作簿2.1、使用工作簿2.2、操作…...

Java入门

Java导入包 import 主要用于导入在使用类前准备好了Import 关键字可以多次使用&#xff0c;导入多个包Import 关键字可以多次使用&#xff0c;导入多个类如果同一个包中需要大量的类&#xff0c;那么可以使用通配符进行导入如果Import了不同包&#xff0c;相同名称的类&#x…...

深度解析BERT:从理论到Pytorch实战

本文从BERT的基本概念和架构开始&#xff0c;详细讲解了其预训练和微调机制&#xff0c;并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型。我们探讨了BERT的核心特点&#xff0c;包括其强大的注意力机制和与其他Transformer架构的差异。 关注TechLead&#x…...

小程序数据导出文件

小程序josn数据生成excel文件 先从下载传送门将xlsx.mini.min.js拷贝下来&#xff0c;新建xlsx.js文件放入小程序项目文件夹下。 const XLSX require(./xlsx)//在需要用的页面中引入// 定义导出 Excel 报表的方法exportData() {const that thislet newData [{time:2021,val…...

hadoop1.2.1伪分布式搭建

0.使用host-only方式 将Windows上的虚拟网卡改成跟Linux上的网卡在同一网段 注意&#xff1a;一定要将widonws上的WMnet1的IP设置和你的虚拟机在同一网段&#xff0c;但是IP不能相同 1.Linux环境配置&#xff08;windows下面的防火墙也要关闭&#xff09; 1.1修改主…...

DLSS Swapper智能工具:游戏性能优化与版本管理完全指南

DLSS Swapper智能工具&#xff1a;游戏性能优化与版本管理完全指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的深度学习超级采样(DLSS)版本管理工具&#xff0c;能够自动扫描…...

抖音无水印视频批量下载全攻略:技术解析与实战指南

抖音无水印视频批量下载全攻略&#xff1a;技术解析与实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

AI应用架构师讲解AI在金融市场应用案例的模型构建

AI应用架构师讲解&#xff1a;AI在金融市场应用案例的模型构建 一、引入与连接&#xff1a;当AI成为金融市场的“智能分析师” 2023年&#xff0c;某头部量化基金的AI策略实现了35%的年化收益率&#xff0c;远超市场平均水平&#xff1b;同年&#xff0c;某国有银行用AI风险模型…...

洛雪音乐音源修复实战指南:从零开始的插件化解决方案

洛雪音乐音源修复实战指南&#xff1a;从零开始的插件化解决方案 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 当你点击播放按钮却只看到加载动画无限循环&#xff0c;当搜索结果永远停留在&qu…...

在GCP上运行autoresearch

Andrej Karpathy最近开源了autoresearch&#xff0c;这是一个将真实LLM训练环境交给AI代理并让它自主实验的项目。代理修改模型代码&#xff0c;训练恰好5分钟&#xff0c;检查验证损失是否改善&#xff0c;保留或丢弃更改&#xff0c;然后重复。你去睡觉&#xff1b;醒来时会看…...

vscode|无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No such

无法连接到远程主机服务器&#xff08;错误&#xff1a; CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: "No such file or directory" })))这是一个典型的 VSCode Remote-SSH 连接失败 错误。虽然本地网络正常、服务器在线&#xff0c;但 VSCod…...

【Python】利用Python实现微信公众号文章定时自动发布

1. 微信公众号自动发布的基础原理 很多人可能不知道&#xff0c;微信公众号其实提供了完整的开发者接口&#xff0c;允许我们通过代码来管理内容。这就像给你的公众号装了一个遥控器&#xff0c;不用每天手动登录后台点点戳戳。我最早发现这个功能时&#xff0c;简直像发现了新…...

深学邦内容语料价值(腾讯旗下AI助手元宝)分析:A-(优秀级垂直信源)

评估机构&#xff1a;元宝&#xff08;由腾讯出品&#xff09; 评估方式&#xff1a;基于腾讯知识库语料筛选模型与垂直领域可信度评估体系 报告日期&#xff1a;2026年3月 一、评估背景与核心逻辑 作为腾讯旗下的通用型AI助手&#xff0c;我的知识库覆盖全领域文本数据。 …...

ESP32 RMT驱动DHT22克隆传感器负温解析方案

1. 项目概述DHT22_Clone_ESP32 是一个专为 ESP32 系列 SoC 设计的高鲁棒性 DHT22 传感器驱动库&#xff0c;其核心价值在于系统性解决克隆/仿制 DHT22 传感器在负温场景下的数据解析错误问题。该库并非简单封装&#xff0c;而是基于对 DHT22 协议物理层、时序特性和厂商固件差异…...

嵌入式系统模块化设计:内聚与耦合实战指南

1. 嵌入式模块设计的核心原则在嵌入式系统开发中&#xff0c;模块化设计质量直接影响着整个系统的生命周期成本。我经历过多个嵌入式项目后发现&#xff0c;那些后期维护成本高昂的系统&#xff0c;往往都存在模块边界模糊、依赖混乱的问题。模块化不是简单的代码分割&#xff…...