从零开学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.xdnf.cn/news/142828.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2024年CAD图纸加密软件|加密图纸软件推荐:10款高效CAD加密软件

在当今数字化时代&#xff0c;CAD图纸已成为工程设计、建筑规划、机械制造等领域不可或缺的重要文件。然而&#xff0c;随着数据泄露和信息安全问题的日益严重&#xff0c;保护CAD图纸的安全性变得尤为重要。为了确保设计数据的安全&#xff0c;使用高效的CAD图纸加密软件成为了…

Stack类:常见方法讲解、使用场景、底层实现及算法问题

Stack 类是 Java 集合框架中的一个经典类&#xff0c;用于实现后进先出&#xff08;LIFO, Last In First Out&#xff09;数据结构。虽然 Stack 类作为一种直接的堆栈实现存在&#xff0c;但在开发中&#xff0c;Deque 或 LinkedList 更常被推荐用于堆栈的实现。不过&#xff0…

为什么说Claude3.5 sonnet好于GPT4O?实为网友们的无耐选择

引言 写作时&#xff0c;选择合适的工具就像船长选择航行的船只。语言模型作为目前最流行的技术工具之一&#xff0c;涉及每个人的生活与工作。Claude和GPT-4o是两款备受关注的语言模型&#xff0c;许多人自然而然地将二者进行比较&#xff0c;认为Claude更优。然而&#xff0…

时间复杂度计算 递归(solve2 后续)

原帖 最近校内比较忙&#xff0c;更新缓慢&#xff0c;致歉。 这里函数每次都需要遍历 h h h 和 m m m 之间的数&#xff08;复杂度 O ( n ) O(n) O(n)&#xff09;&#xff0c;所以和 solve1 略有不同。仍然假设 T ⁡ ( n ) \operatorname{T}(n) T(n) 表示 m − h 1 n…

python五子棋之对战项目源码【免费】

五子棋之对战项目是一种基于五子棋游戏规则的在线或本地对战项目。五子棋作为一种两人对弈的纯策略型棋类游戏&#xff0c;具有简单易学、策略性强的特点&#xff0c;因此非常适合作为对战项目的核心玩法。这个项目源码是使用Python编程语言实现的 源码下载地址&#xff1a; …

STL相关简介

string 看到这个词&#xff0c;相信大家一定都很好奇什么是string&#xff0c;它有什么作用呢&#xff1f;今天&#xff0c;就让我们一起来了解一下关于string的简介吧~ 目录 string 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的…

【3D打印】使用simplify 3D切片更改Gcode手动断电续打、掉电、未打完继续打印、补救

一、问题描述 有些时候会遇到3D打印机没料但机器还在继续打、掉电重启后未正常恢复打印、挤出机端没有料但断料检测未触发等情况。我们又不想打印放弃&#xff0c;但又想继续之前的进度打印。 这时候我们需要更改3D打印文件的切片参数来进行继续打印。 图中问题&#xff1a;可…

知识图谱与异构图神经网络(7)--1

知识图谱是由实体(节点)和关系( 不同类型的边) 组成的多关系图。作为一种非常重要又特殊的图结构数据&#xff0c;知识图谱被广泛应用在人工智能和自然语言处理领域&#xff0c;从语义解析、命名实体消歧到问答系统、推荐系统中都可以看到来自知识图谱的技术推动。本质上&#…

微服务下设计一个注解标识是否需要登录

需求 现在我们是微服务系统&#xff0c;需要设计一个注解 RequiredLogin &#xff0c;当标识这个注解时表示系统需要登录才能继续操作。 实现思路 首先&#xff0c;需要明确我们要拦截的是从浏览器过来的请求&#xff0c;服务之间的互相调用是不需要拦截的&#xff08;比如 …

【python设计模式1】面向对象设计原则

目录 设计模式分类 面向对象 接口 面向对象设计原则 里氏替换原则 依赖倒置原则 接口隔离原则 单一职责原则 设计模式是对软件设计中普遍存在或反复出向的各种问题所提出的解决方案。每一个设计模式系统地被命名、解释和评价了面向对象系统中一个重要和重复出现的设计。…

基于MicroPython的ESP32控制LED灯闪烁设计方案的Wokwi仿真

以下是一个基于MicroPython的ESP32控制LED灯闪烁设计方案的Wokwi仿真&#xff1a; 一、硬件准备&#xff1a; 在Wokwi仿真平台(https://wokwi.com/)选择ESP32开发板&#xff0c;添加一个LED灯&#xff0c;和一个220欧姆限流电阻。 二、硬件连接&#xff1a; 1. 将LED灯的阳极…

【例题】lanqiao4403 希尔排序模板题

插入排序每次只能将数据移动一位。 已知插入排序代码为&#xff1a; def insert_sort(a):for i in range(1,len(a)):ji-1while j>0 and a[j]>a[i]:a[j1]a[j]j-1a[j1]a[i]return a希尔排序在插入排序的基础上&#xff0c;将数据移动n/2,n/4,…,1位。 for i in range(ga…

Git:Git管理

目录 Git 文件管理检测文件状态 status跟踪新文件 add提交更新 commit撤销提交 Commit Git 校验和历史查看 log版本回退 resetgit 忽略文件 Git 分支管理Git 提交对象Git master分支Git 分支管理本地分支管理远程分支管理分支hotfix处理 Git 工作流常见分支冲突处理分支合并冲突…

冒泡排序的C++语言实现(不用std::sort)

自己写一个冒泡排序的代码。 void vSort(std::vector<int> & vec, bool bDescending) {//冒泡排序int iTail vec.size()-1;while(iTail > 0){for(int k 0; k < iTail; k){int f1 vec.at(k);int f2 vec.at(k1);if(f1 < f2){//默认是降序int iTmp vec.a…

第十一章 【后端】商品分类管理微服务(11.3)——商品管理模块 yumi-etms-goods

11.3 商品管理模块 yumi-etms-goods 新建 yumi-etms-goods 模块 添加依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns&#

ESP32工程添加.c .h文件及常见错误

一、编译环境添加 如果编译的文件在main文件夹下&#xff0c;在main文件夹下的CMakeLists.txt中添加对应的.c文件&#xff0c;如下图所示。 二、常见问题 1- undefined reference to xxx C语言中使用static修饰函数时&#xff0c;意味着该函数的作用域仅限于定义它的文件。…

【Python123题库】#体育收入排行2012-2019

禁止转载&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_45801887/article/details/140087809 参考教程&#xff1a;B站视频讲解——https://space.bilibili.com/3546616042621301 有帮助麻烦点个赞 ~ ~ Python123题库 体育收入排行2012-2019 体育收入排行2012-2019 …

CentOS7 MySQL8.0 启动失败 Data Dictionary initialization failed

CentOS7 MySQL8.0 启动失败 Data Dictionary initialization failed 重点&#xff01;&#xff01;&#xff01; 此方案会删除数据的&#xff01;&#xff01;&#xff01; 类似重置一样&#xff01; 报错 查看日志&#xff1a;/var/log/mysqld.log 解决方案 查看配置文…

Python热频随机森林分类器算法模型模拟

&#x1f3af;要点 研究发射测量斜率和时滞热频率表征&#xff0c;使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应&#xff0c;测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…

动手学深度学习(四)卷积神经网络-下

全连接层存在的问题&#xff1a;参数过大&#xff0c;计算成本过高。 一、网络中的网络&#xff08;NiN&#xff09; 1、NiN块 ①NiN块的结构 NiN串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。这种由卷积层和“全连接”层构成的小网络就是NiN块。 &#…