C++多态~~的两个特殊情况

news2024/11/18 3:31:49

目录

1.多态的概念

2.简单认识

(1)一个案例

(2)多态的两个满足条件

(3)虚函数的重写

(4)两个特殊情况


1.多态的概念

(1)多态就是多种形态;

(2)具体而言:就是不同的对象去完成相同的任务的时候,产生的效果是不一样的,产生了不同的形态;

2.简单认识

(1)一个案例

#include<iostream>
using namespace std;
class person
{
public:
	virtual void buyticket()
	{
		cout << "person成人票---全价" << endl;
	}
};
class student :public person
{
public:
	virtual void buyticket()
	{
		cout << "student学生票--半价" << endl;
	}
};
void func(person& p)
{
	p.buyticket();
}
int main()
{
	person p1;
	student st1;
	func(p1);
	func(st1);
	return 0;
}

我们这个就是拿的当代大学生乘坐动车和高铁可以获得折扣的例子演示的,我们定义了两个类,这两个类之间就是普通的继承关系,student继承person类,两个类里面都有一个虚函数,就是以virtual开头的函数,我们分别定义了两个对象,两个对象分别作为函数的参数传递进去,我们可以发现,当我们传递的参数是父类的对象的时候,我们会发现这个打印的结果就是成人票,我们传递的参数是子类对象的时候,这个打印的结果就是学生票,就是传递进去不同的参数,这个打印的结果就是不一样的,像这种我们把不同的对象,完成相同的任务(在这个里面就是去调用buyticket函数),出现不同的结果的现象,我们称之为多态;

(2)多态的两个满足条件

第一个就是虚函数的重写,第二个就是通过父类的指针或者是引用进行调用虚函数,这个指针或者是引用必须是父类的,因为这个如果是子类的话,他就是只能接受子类传递过来的对象,不能接受传递的父类的对象;

但是如果是父类的指针或者是引用的话,我们可以传递父类对象,也可以传递子类的对象,就算是传递的子类的对象,我们也是可以只把子类里面属于父类的成员函数和成员变量传递过去,这个就是复制兼容性规则,也就是我们常说的切片,在两个满足继承关系的情况下,这个是允许的;

(3)虚函数的重写

虚函数的重写也是需要满足三个条件的,都是针对这个父类和子类的函数的,父类和子类的虚函数要求满足函数的名字相同,函数的参数相同而且函数的返回值相同,这三个条件就是构成虚函数重写的条件,而虚函数的重写,又是构成多态的条件;

virtual只能进行修饰成员函数,否则(virtual修饰其他的非成员函数)就会报错;

(4)两个特殊情况

协变:虚函数的返回值可以不一样,但是要求必须是父类或者是子类的指针或者是引用;

下面就是这个特殊情况的举例,在这个函数的返回值是父类的引用或者是指针的时候,这个时候的函数的返回值虽然是不一样的,但是这个依然可以构成虚函数的重写;

class person
{
public:
	virtual person* buyticket()
	{
		cout << "person成人票---全价" << endl;
		return nullptr;
	}
};
class student :public person
{
public:
	virtual student* buyticket()
	{
		cout << "student学生票--半价" << endl;
		return nullptr;
	}
};

第二种特殊情况就是这个子类的虚函数可以不在这个函数的前面添加上virtual,这个其实是很重要的,为什么要这么进行设计,其实是和这个析构函数有一些关系的;

我们之前介绍过,因为多态的原因,这个在析构函数的执行会被进行特殊的处理,就是全部转化成为destructor(这个具体是什么我们后面还是会进行学习的);

下面我们给上面的这个案例的代码添加上析构函数,来解释一下为什么这个子类的虚函数的前面可以不用添加上virtual关键字;

这个运行结果也是没有问题的,因为我们执行完成之后进行对象的析构,p1是父类的对象就是调用父类的析构函数,s1是子类的对象就会先调用子类的析构函数,子类的析构函数执行完毕之后就会自动调用父类的析构函数(上一次我们在继承里面已经介绍过了,这个是在继承的前提下面默认进行的,而且是必须按照这个顺序,因为我们的子类继承了父类的成员变量或者是成员函数,我们先析构父类,如果这个子类里面使用就会造成野指针的问题,我们先析构子类,在析构父类的时候,父类是没有收到任何影响的,所以析构的顺序就是先子类后父类);

我们接下来换一种情况进行演示:

父类的指针可以指向父类的对象,也可以指向子类的对象,但是执行析构函数的时候,调用析构函数的时候是根据这个指针的类型调用的,所以两个析构都是调用的父类的构造函数,但是我们想要第二次调用子类的析构函数,这个时候我们就需要在这个析构函数的前面添加上virtual,就可以正确调用析构函数;

但是,如果我们忘记写这个virtual,我们只需要在这个父类析构函数前面加上virtual,我们在子类里面不添加virtual也可以完成这个正常的调用;

这个就是在我们忘记写子类的析构函数的情况下,只要我们把这个父类的析构函数前面加上virtual,我们这个子类里面不添加virtual也是可以正常调用的,这个就是上面的第二个特殊情况为这个情景开了一个绿灯,如果我们忘记写了,不会影响这个程序的执行;

但是,对于上面的这两个特殊情况,我们只需要了解即可,在我们平常去写代码的话,我们还是规范书写,减少这些不必要的麻烦;

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

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

相关文章

某腾X滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE= 1. 先整体分析一下 1_1. 验证码信息下发接口 cap_union_prehandle ua:…

AI绘画工具Midjourney:和Discord互相成就

前言 提到文生图&#xff0c;很多人都会想到植根于根植于Discord社区的Midjourney&#xff0c;本篇文章就基于作者的使用体验思考&#xff0c;并结合了Discord来对Midjourney进行探讨&#xff0c;感兴趣的朋友一起来看看吧。 如果要说现在最火的文生图&#xff0c;不得不说到Mi…

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

本周波动预警!7月将一路上涨,牛市“复苏“?低于6万美元的比特币,是熊市陷阱吗?

比特币在第三季度伊始发出了一些积极信号。随着上周末的涨势&#xff0c;BTC/USD最高一度达到63818美元&#xff0c;这让人对比特币能否重拾牛市信心满怀希望。不过&#xff0c;在冲破关键阻力位64000美元之前&#xff0c;市场参与者仍保持谨慎态度。比特币要想维系开头的牛市态…

掌握React与TypeScript:从零开始绘制中国地图

最近我需要使用reactts绘制一个界面&#xff0c;里面需要以中国地图的形式展示区块链从2019-2024年这五年的备案以及注销情况&#xff0c;所以研究了一下这方面的工作&#xff0c;初步有了一些成果&#xff0c;所以现在做一些分享&#xff0c;希望对大家有帮助&#xff01; 在这…

使用Qt制作一个简单的界面

1、创建工程 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 选择 build system&#xff0c;有qmake、CMake 和 Qbs 三个选项。 CMake 很常用&#xff0c;功能也很强大&#xff0c;许多知名的项目都是用它&#xff0c;比如 OpenCV 和 VTK&#xff0c;但它的语法繁…

heic格式转化jpg如何操作?heic转jpg,分享6款图片转化器!

随着苹果iOS 11系统的推出&#xff0c;HEIC格式作为一种新的图片格式逐渐走进大众视野&#xff0c;heic格式在保证照片质量的同时&#xff0c;能显著减少系统存储空间的占用。然而&#xff0c;这也给非苹果用户带来了一些困扰&#xff0c;因为HEIC格式的图片在Windows系统上并不…

深入理解C# log4Net日志框架:功能、使用方法与性能优势

文章目录 1、log4Net的主要特性2、log4Net框架详解配置日志级别 3、log4Net的使用示例4、性能优化与对比5、总结与展望 在软件开发过程中&#xff0c;日志记录是一个不可或缺的功能。它可以帮助开发者追踪错误、监控应用程序性能&#xff0c;以及进行调试。在C#生态系统中&…

探秘 Django 专业之道

一、Django项目开发 1.web框架底层 1.1 网络通信 注意&#xff1a;局域网 个人一般写程序&#xff0c;想要让别人访问&#xff1a;阿里云、腾讯云。 去云平台租服务器&#xff08;含公网IP&#xff09;程序放在云服务器 先以局域网为例 我的电脑【服务端】 import sock…

无法访问指向的web服务器(或虚拟主机)的目录,请检查网络设置

微信公众平台,进行业务域名、JS接口安全域名、网页授权域名配置时&#xff0c;遇到的问题中有&#xff1a;无法访问指向的web服务器&#xff08;或虚拟主机&#xff09;的目录&#xff0c;请检查网络设置&#xff0c;这里简单记录一下处理过程。 关于这个问题首先保证下载…

基于PHP技术的校园论坛设计的设计与实现08586

基于PHP技术的校园论坛设计的设计与实现 摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统&#xff0c;以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能&#xff0c;并结合社交化特点&#xff0c;增强…

2023软考中级《软件设计师》(备考冲刺版) | 数据库系统

目录 1.数据库的基本概念 1.1 数据库体系结构 1.2 三级模式结构 1.3 数据仓库 2.数据库设计过程 2.1 概念结构设计 2.1.1 概念设计过程 2.1.2 E-R图 2.2 逻辑结构设计 2.2.1 关系模式相关概念 2.2.2 E-R图转关系模式&#xff08;涉及下午题&#xff09; 2.2.3 关系…

SysML与MBSE的关系

SysML与MBSE的关系 对于任何基于模型的系统工程 &#xff08;MBSE&#xff09; 方法&#xff0c;推荐的最佳实践是基于模型的语言、基于模型的工具、基于模型的流程和基于模型的架构框架的协同应用&#xff0c;如下图所示 系统架构四元组 图。经过十年将SysML应用于棘手的系统…

海思NNIE部署yolov5-shufflenet

1.简要说明 由于NNIE上transpose支持的顺序是固定的,shufflenet那种x=torch.transpose(x,1,2).contiguous() 的操作一般是不支持的。需要进行调整。 2.使用工程以及修改 使用的是开源工程:GitHub - Lufei-github/shufflev2-yolov5: shufflev2-yolov5:lighter, faster and ea…

基于“香港世界”的SLAM技术介绍

在视觉感知技术中&#xff0c;理解和描述复杂的三维室外场景至关重要&#xff0c;尤其是自动驾驶技术的发展要求对陌生环境具有更强的适应能力和鲁棒性。传统上&#xff0c;使用“曼哈顿世界”和“亚特兰大世界”模型来描述具有垂直和水平结构的城市场景。 当遇到像香港这样地形…

python爬虫之scrapy框架基本使用

python爬虫之scrapy框架基本使用 1、环境安装&#xff1a;pip install scrapy 2、创建一个工程&#xff1a;scrapy startproject xxxPro 3、cd xxxPro 4、在spiders子目录中创建一个爬虫文件&#xff1a;scrapy genspider spiderName www.xxx.com 5、执行工程&#xff1a;scra…

当年很多跑到美加澳写代码的人现在又移回香港?什么原因?

当年很多跑到美加澳写代码的人现在又移回香港&#xff1f;什么原因&#xff1f; 近年来&#xff0c;确实有部分曾经移民到美国、加拿大、澳大利亚等地的香港居民选择移回香港。这一现象与多种因素相关&#xff0c;主要可以归结为以下几点&#xff1a; 疫情后的环境变化&#…

高通源代码版本ADK工具版本源代码release版本MDE版本介绍

0 Preface/Foreword 1 版本介绍 高通代码存放在chipcode中&#xff0c;网址URL&#xff1a;Chipcode 1.1 高通源代码版本 Bluetooth Audo芯片的高通源代码版本号&#xff08;类似于分类的类名&#xff09;&#xff1a;ADK.SRC.1.0 &#xff08;最新qcc307x系列及之后的芯片如…

如何用matplotlib绘制图像分类任务的类别特征空间分布

import matplotlib.pyplot as plt import numpy as np from sklearn.decomposition import PCA from sklearn.datasets import load_iris from mpl_toolkits.mplot3d import Axes3D# 加载示例数据&#xff08;Iris 数据集&#xff09; data load_iris() X data.data y data.…

wordpress建站有哪些优点

对于绝大多数站长来说&#xff0c;使用wordpress建站是一个非常不错的选择。那么wordpress建站有哪些优点呢&#xff1f;下面小编就来为大家解答。 1.wordpress是什么&#xff1f; WordPress是一款全球最受欢迎的内容管理系统&#xff08;CMS&#xff09;&#xff0c;主要用于…