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

目录

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也是可以正常调用的,这个就是上面的第二个特殊情况为这个情景开了一个绿灯,如果我们忘记写了,不会影响这个程序的执行;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows USB设备驱动开发-双角色驱动

在USB的通讯协议中&#xff0c;规定发起连接的一方为主机(Host)&#xff0c;接受连接的一方为设备&#xff0c;这可以用U盘插入电脑举个例子&#xff0c;当U盘插入电脑后&#xff0c;电脑这边主动发起查询和枚举&#xff0c;U盘被动响应查询和数据存取。 USB 双角色驱动程序堆…

为Ubuntu-24.04-live-server-amd64磁盘扩容

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 文章目录 系列文章目录前言一、检查系统本身情况1.用 lsblk 命令查看自己系统磁盘是什么状态2.用 df -h 命令查看文件系统的磁盘空间使用情况3.解决 Ubuntu-24.04 磁盘空间只能用一半的问题3-1扩展逻辑卷&#xff…

二叉树层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 假设有这样一棵二叉树&#xff0c;那么它经过层序遍历的结果就应该是&#xff1a; [[3],[9,20],[15,7]]解法 我们可以用广度…

css美化滚动条样式

效果展示 实现 滚动条宽&#xff0c;高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…

IDEA安装使用、JDBC

day53续 IDEA安装 浏览器搜索&#xff0c;在idea官网直接下载需要的版本安装包&#xff0c;安装流程基本无脑 对于专业版要激活&#xff0c;可找相关资源也可购买&#xff1b;社区版不需要 配置环境变量 JDBC JDBC:java database connectivity SUN公司提供的一套操作数据库的…

计算机毕业设计Python深度学习美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

Python美食推荐系统开题报告 一、项目背景与意义 随着互联网和移动技术的飞速发展&#xff0c;人们的生活方式发生了巨大变化&#xff0c;尤其是餐饮行业。在线美食平台如雨后春笋般涌现&#xff0c;为用户提供了丰富的美食选择。然而&#xff0c;如何在海量的餐饮信息中快速…

【Excel、RStudio计算T检测的具体操作步骤】

目录 一、基础知识1.1 显著性检验1.2 等方差T检验、异方差T检验1.3 单尾p、双尾p1.3.1 检验目的不同1.3.2 用法不同1.3.3 如何选择 二、Excel2.1 统计分析工具2.1.1 添加统计分析工具2.1.2 数据分析 2.2 公式 -> 插入函数 -> T.TEST 三、RStudio 一、基础知识 参考: 1.…

2.2章节python的变量和常量

在Python中&#xff0c;变量和常量有一些基本的概念和用法&#xff0c;但需要注意的是&#xff0c;Python本身并没有内置的“常量”类型。然而&#xff0c;程序员通常会遵循一种约定&#xff0c;即使用全部大写的变量名来表示常量。 一、变量 在Python中&#xff0c;变量是一…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…

基于X86+FPGA的精密加工检测设备解决方案

应用场景 随着我国高新技术的发展和国防现代化发展&#xff0c;航空、航天等领域需 要的大型光电子器件&#xff0c;微型电子机械、 光 电信息等领域需要的微型器件&#xff0c;还有一些复杂零件的加工需求日益增加&#xff0c;这些都需要借助精密甚至超精密的加工检测设备 客…

算法 —— 滑动窗口

目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 长度最小的子数组 sum比target小就进窗口&#xff0c;sum比target大就出窗口&#xff0c;由于数组是正数&#xff0c;所以相加会使sum变大&#xff0c;相减…

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

前端工程化09-webpack静态的模块化打包工具(未完结)

9.1、开发模式的进化历史 webpacks是一个非常非常的强大的一个工具&#xff0c;相应的这个东西的学习也是有一定的难度的&#xff0c;里边的东西非常的多&#xff0c;里面涉及到的 概念的话也是非常非常的多的。 这个东西既然非常重要&#xff0c;那么在我们前端到底处于怎样…

填志愿选专业,文科男生如何选专业?

又到了高考分数出炉&#xff0c;无数学子收获喜悦的季节&#xff0c;在分数刚出炉时&#xff0c;很多学生表现的异常兴奋&#xff0c;于他们而言&#xff0c;这么多年的努力终于有了收获&#xff0c;自己该考虑选择什么专业了。而毫不夸张的说&#xff0c;很多人在拿到专业目录…

前程无忧滑块

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

使用机器学习,轻松预测问题产品,低成本高效率解决产品质量监测需求

01、案例说明 这个案例是一个酒厂&#xff0c;通过对其产品中不同化学性质的指标数值&#xff0c;寻找哪些是可能出现问题的产品。这是一个标准的离异点&#xff08;Outlier&#xff09;使用情形。 如果能够将在不同属性的一定范围之内的数据&#xff0c;作为判断的标准&#…

JS(JavaScript)的BOM操作

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C语言实现简单的minishell

探索开源项目&#xff1a;MiniShell 引言 在计算机编程的世界里&#xff0c;Shell 是一个至关重要的组成部分&#xff0c;它允许用户与操作系统交互&#xff0c;执行命令和程序。MiniShell 是一个简化版的 Shell 程序&#xff0c;通常用于教学和学习目的。在本文中&#xff0…

印尼火出圈的本土网盟okspin助力slot游戏广告代投策略

印尼火出圈的本土网盟okspin助力slot游戏广告代投策略 在当今日益全球化的数字营销环境中&#xff0c;本土网盟广告平台在推广特定地区的产品和服务方面发挥着至关重要的作用。特别是在印尼这样的多元文化市场中&#xff0c;本土网盟okspin投放印尼slots游戏广告的优势尤为显著…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…