从零开学C++:多态

引言:在我们去购买汽车票的时候,我们总会遇到成人全价,学生打折的情况。不同的对象(成人、学生)进行同一操作(购买车票),得到不同的结果(全价、打折),此时这就是我们多态思想的体现。那么我们如何使用C++实现多态呢?请听我接下来的讲解。

更多有关C++的知识详解可前往个人主页:计信猫

一,虚函数

1,虚函数的定义

        虚函数就是一个被virtual修饰的成员函数,如下所示:

class person
{virtual void buy(){cout << "全价" << endl;}
};

2,虚函数的重写

        虚函数重写(覆盖)派生类中有一个与基类的虚函数完全相同的虚函数。此时就可以说是基类的虚函数被子类重写(覆盖)了。 

完全相同:

1,函数的返回值相同

2,函数的名字相同

3,函数的参数相同(只看参数类型)

        如下的例子所示:

class person
{virtual void buy(){cout << "全价" << endl;}
};
class student :public person
{virtual void buy(){cout << "打折" << endl;}
};

        此时派生类buy函数就重写了基类buy函数

3,虚函数重写的两个例外

(1)协变

        协变的定义是基类虚函数返回基类对象的指针或者引用派生类虚函数返回派生类对象的指针或者引用协变的出现导致了虚函数重写的返回值不同,但是并不会出现报错。如下便是一个协变的试例:

class A
{};
class B :public A
{};
class person
{virtual A* buy(){cout << "全价" << endl;}
};
class student :public person
{virtual B* buy(){cout << "打折" << endl;}
};

(2)析构函数的重写

         在我们编写程序时,更加建议将析构函数写成虚函数的形式,以便应对以下情况:

int main()
{A* a = new B;delete a;return 0;
}

        所以我们可以将AB析构函数进行如下处理:

class A
{
public:virtual ~A(){}
};
class B :public A
{
public:virtual ~B(){}
};

        此时B类析构函数仍然重写了A析构函数,虽然在表面上它们的函数名并不相同,但是在底层处理的时候,其实它们的析构函数名称都被编译器处理为了destructor,因此其实它们的函数名是相同的。

4,override和final

(1)override

        override关键字用于检查派生类的某个虚函数是否重写了基类的虚函数,如果没有重写,那么在编译阶段就会发生报错。如下所示:

class person
{/*virtual void buy(){cout << "全价" << endl;}*/
};
class student :public person
{virtual  void buy()override{cout << "打折" << endl;}
};

        此时派生类buy函数并没有发生重写,那么我们的override关键字就会让程序在编译阶段出现报错:

(2)final

        final关键字修饰的虚函数则不能进行重写。如下方式使用:

class person
{virtual void buy()final{cout << "全价" << endl;}
};

         那么此时基类personbuy函数就不能被它的派生类重写,不然就会发生报错。

二,多态

        所以有了前边我们所学习的虚函数知识的支持,那么我们就可以实现一个简单的多态了。此时以前边的成人和学生买票为例(成人买票就是全价,学生买票就是打折)。

        在实现多态之前,我们需要遵循一下规则:

1,需使用基类的指针或引用调用虚函数

2,被调用的函数为virtual修饰的(即为虚函数)

        那么我们实现的多态如下:

class person
{
public:virtual void buy(){cout << "成人全价" << endl;}
};
class student :public person
{
public:virtual void buy(){cout << "学生打折" << endl;}
};
void func(person& obj)
{obj.buy();
}
int main()
{person p;student s;func(p);func(s);return 0;
}

         此时我们代码一走,那么结果如下:

三,纯虚函数

        纯虚函数的定义十分简单,只需要虚函数的声明之后加上=0即可,如下:

virtual void buy()=0

        纯虚函数一般不会进行实现,有声明即可。

四,抽象类

        含有纯虚函数的类即为抽象类,如下的person类就为抽象类

class person
{
public:virtual void buy()=0
};

        如果派生类不重写纯虚函数,那么其派生类也为抽象类。 

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

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

相关文章

Redis实现发布/订阅功能(实战篇)

前言 博主在学习 Redis 实现发布订阅功能的时候&#xff0c;踩了太多的坑。 不是讲解不详细&#xff0c;看的一知半解&#xff1b;就是代码有问题&#xff0c;实际压根跑不起来&#xff01; 于是博主萌生了自己写一个最新版且全程无错的博客供各位参考。希望各位不要把我才过…

深入理解IP地址分类及子网划分详解

在互联网时代&#xff0c;IP地址是网络通信的基础。无论是访问网站、发送电子邮件&#xff0c;还是进行数据传输&#xff0c;IP地址都扮演着至关重要的角色。本文将详细解析IP地址的分类及子网划分的原理&#xff0c;帮助你更好地理解网络架构及其应用。 一、什么是IP地址 IP…

教师薪酬管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;老师信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

Android MediaPlayer + GLSurfaceView 播放视频

Android使用OpenGL 播放视频 概述TextureView的优缺点OpenGL的优缺点 实现复杂图形效果的场景参考 概述 在Android开发中&#xff0c;使用OpenGL ES来渲染视频是一种常见的需求&#xff0c;尤其是在需要实现自定义的视频播放界面或者视频特效时。结合MediaPlayer&#xff0c;我…

吸浮毛宠物空气净化器推荐,希喂、小米、有哈宠物空气净化器测评

养猫需谨慎&#xff0c;不然就要做猫奴一辈子啦&#xff01;上次堂妹来我家住几天&#xff0c;刚开始还担心和猫处不来&#xff0c;不敢去摸它&#xff0c;走的时候已经约好下次来看它的时间&#xff0c;笑死我了。毕竟猫咪这么可爱&#xff0c;很少有人可以抵抗它的魅力。 这不…

什么是科技与艺术相结合的异形创意圆形(饼/盘)LED显示屏

在当今数字化与创意并重的时代&#xff0c;科技与艺术的融合已成为推动社会进步与文化创新的重要力量。其中&#xff0c;晶锐创显异形创意圆形LED显示屏作为这一趋势下的杰出代表&#xff0c;不仅打破了传统显示设备的形态束缚&#xff0c;更以其独特的造型、卓越的显示效果和广…

3谐振功率放大器的实际电路设计

1原理电路 下图是谐振功率放大器的原理电路&#xff0c;如果我们照着下图搭一个电路&#xff0c;会发现它可能实现不了功率放大?这是为什么&#xff1f; 2实际电路设计 2.1要注意直流馈电线路 馈电原则(馈电供电)&#xff1a; 1&#xff09;保证直流电流分量流过直流电源&…

基于SpringBoot+Vue的校园礼服装租赁系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

【Java 优选算法】双指针(下)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 有效三角形的个数 题目链接 解法 解法1:暴力枚举--->O(n^3) 解法2:利用单调性,使用双指针来解决---->O(n^2) 优化:对整个数组进行排序先固定最大数在最大数的左…

【模板代码的组织结构与模板的显式实例化和声明】模板代码的组织结构与模板的显式实例化和声明

一、模板的组织结构 之前对于模板&#xff0c;我们都是写在同一个 . c p p .cpp .cpp文件下&#xff0c;那如果我们将模板分开&#xff0c;单独开一个 . h .h .h和 . c p p .cpp .cpp来创建模板&#xff0c;会发生什么&#xff1f; 首先&#xff0c;我们创建一个 m y c l a s…

【2024.08】图模互补:知识图谱与大模型融合综述-笔记

阅读目的&#xff1a;假设已有一个知识图谱&#xff0c;如何利用图谱增强模型的问答&#xff0c;如何检索知识图谱、知识图谱与模型的文本如何相互交互、如何利用知识图谱增强模型回答的可解释性。 从综述中抽取感兴趣的论文进一步阅读。 来源&#xff1a;图模互补&#xff1…

阿里云 Quick BI使用介绍

Quick BI使用介绍 文章目录 阿里云 Quick BI使用介绍1. 创建自己的quick bi服务器2. 新建数据源3. 上传文件和 使用4. 开始分析 -选仪表盘5. 提供的图表6. 一个图表的设置使用小结 阿里云 Quick BI使用介绍 Quick BI是一款全场景数据消费式的BI平台&#xff0c;秉承全场景消费…

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 文章目录 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f;1. 什么是梯度&#xff1f;2.梯度…

华为eNSP使用详解

eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是华为提供的一款网络仿真平台&#xff0c;它允许用户在没有真实设备的情况下进行网络实验和学习网络技术。eNSP可以模拟各种网络设备&#xff0c;如交换机、路由器、防火墙等&#xff0c;并支持创建多种网…

Linux 环境打包 QT 程序

目录 前言 一、安装Qt库和编译器 二、编译生成可执行文件 三、准备脚本 四、添加程序依赖库 五、添加 Qt 相关依赖库 六、发布 deb 安装包 参考文章 前言 Qt是一个跨平台的GUI框架&#xff0c;可以在多种操作系统上运行&#xff0c;包括Linux、Windows和macOS。因此&am…

ASP.NET Core高效管理字符串集合

我们在开发 Web 项目时经常遇到需要管理各种来源的字符串集合&#xff08;例如HTTP 标头、查询字符串、设置的值等&#xff09;的情况。合理的管理这些字符串集合不仅可以减少出bug的几率&#xff0c;也能提高应用程序的性能。ASP.NET Core 为我们提供了一种特殊的只读结构体 S…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…

【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转换

前言&#xff1a; 下面打印日志用的是FastJSON依赖库中的 Log4j2。依赖&#xff1a; <!-- Alibaba Fastjson --> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version> …

[Redis] Redis中的set和zset类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个图像添加到累积图像中。 该函数将 src 或其部分元素添加到 dst 中&#xff1a; dst ( x , y ) ← dst ( x , y ) src ( x , y ) if mask…