【C++】多态 (上)

在实际生活中我们也经常见到多态的例子,多态就是不同的对象完成同一个行为时会产生不同的状态,比如成人和儿童购票就是不一样的,多态是可以基于继承的,我们本篇博客的多态就是基于继承的,下面我们先看一个简单例子

class person {
public:
	virtual void BuyTicket() {
		cout << "成人 全价" << endl;
	}
};
class children :public person {
public:
	virtual void BuyTicket() {
		cout << "儿童 半价" << endl;
	}
};
void func(person&p) {
	p.BuyTicket();
}
int main() {
	person s1;
	children s2;
	func(s1);
	func(s2);
	/*person* p1 = new person;
	person* p2 = new children;
	p1->BuyTicket();
	p2->BuyTicket();*/
	return 0;
}

可以看到,虽然这些指针或引用都是父类的,但是产生了不同的结果,恰巧这也是发生多态的一个条件

上面的代码只是一个样例,那么构成多态需要哪些条件呢?

1,虚函数的重写,重写也叫覆盖。重写也要满足条件:必须是父子类中的两个虚函数,两个虚函数有三同(参数,返回值,函数名)

2,需要通过父类的指针或引用去调用虚函数,这也就是我上边为什么会那么写

当然了,虚函数重写也是有特殊情况的

第一种叫做协变,意思是虚函数的返回值可以不同,但返回值必须是父子类关系的指针或者引用,比如

第二种是析构名字的特殊处理,什么意思呢?我们先看下面这种情况

这样的结果不对呀,我们new了一个children,为什么它只析构了person的那一部分,这会造成内存泄漏啊。我们想让析构形成多态,那就还差一个条件,构成虚函数的重写,于是我们加上virtual就可以了。

那你可能会说,不对呀,不是要三同吗?函数名也不同啊,我们上篇博客说过,析构函数名进行了特殊处理,都改成了destructor()

下一种其实也不算是特殊情况,而就是一种形式上的特殊:就是如果父类函数写上virtual,子类不写的话也构成多态,这也说明了一个情况就是重写是函数的实现重写,声明不重写

那么下面我们来区分一下这三个概念:重载、重写(覆盖)、隐藏(重定义)

重载:两个函数在同一作用域,函数名要相同,参数要不同

重写:1.两个函数分别在基类和派生类的作用域2.函数名,参数,返回值都必须相同(协变除外)3.两个函数必须是虚函数

隐藏:1.两个函数分别在基类和派生类的作用域2.函数名相同3.两个基类和派生类的同名函数不构成重写就是重定义

下面是两个有关的关键字,final和override

如果我们要实现一个不能被继承的类,有两种方式,一种是父类的构造函数私有化,这样就无法构建出一个父类对象,另一种就是这个类用final修饰,表示这个类是最终类,不能被继承

除此之外,final还可以修饰虚函数,使它不能被重写

override就是帮助检查重写有无问题,有问题会报错,没问题就直接过

下面有一道较为复杂的题目

class A {
public:
	virtual void func(int val = 1) {
		cout << "A->" << val << endl;
	}
	virtual void test() { func(); }
};

class B :public A {
public:
	void func(int v = 0) {
		cout << "B->" << v << endl;
	}
};
int main() {
	B* p = new B;
	p->test();
	return 0;
}

从主函数开始,p调的test是A继承下来的,那么test的this是A*func又构成重写(参数类型一样就可以,跟形参名无关),又是父亲指针去调用,就构成多态调用,重写又只是实现重写,声明并不重写,所以缺省值还是1

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

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

相关文章

JsonUtility.ToJson 和UnityWebRequest 踩过的坑记录

项目场景&#xff1a; 需求&#xff1a;我在做网络接口链接&#xff0c;使用的unity自带的 UnityWebRequest &#xff0c;数据传输使用的json&#xff0c;json和自定义数据转化使用的也是unity自带的JsonUtility。使用过程中发现两个bug。 1.安全验证失败。 报错为&#xff1a…

.NET Framework 服务实现监控可观测性最佳实践

环境信息 系统环境&#xff1a;Windows Server开发语言&#xff1a;.NET Framework > 4.6.1APM探针包&#xff1a;ddtrace 准备工作 安装 Datakit 主机部署&#xff1a; 主机安装 - 观测云文档 打开采集 APM 采集器 Windows 主机配置 # 到如下路径&#xff0c;把ddtr…

Spring常用设计模式-实战篇之单例模式

实现案例&#xff0c;饿汉式 Double-Check机制 synchronized锁 /*** 以饿汉式为例* 使用Double-Check保证线程安全*/ public class Singleton {// 使用volatile保证多线程同一属性的可见性和指令重排序private static volatile Singleton instance;public static Singleton …

VUE中添加视频播放功能

转载https://www.cnblogs.com/gg-qq/p/10782848.html 常见错误 vue-video-player下载后‘vue-video-player/src/custom-theme.css‘找不到 解决方法 卸载原来的video-play版本 降低原来的版本 方法一 npm install vue-video-player5.0.1 --save 方法二 或者是在pack.json中直…

huggingface的transformers训练gpt

目录 1.原理 2.安装 3.运行 ​编辑 4.数据集 ​编辑 4.代码 4.1 model init​编辑 forward&#xff1a; 总结&#xff1a; 关于loss和因果语言模型&#xff1a; ​编辑 交叉熵&#xff1a;​编辑 记录一下transformers库训练gpt的过程。 transformers/examples/…

使用 Amazon SageMaker 微调 Llama 2 模型

本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高&#xff0c;国内外各种基座大语言竞相出炉&#xff0c;在其基础上衍生出…

MIT的研究人员最近开发了一种名为“FeatUp”的新算法,这一突破性技术为计算机视觉领域带来了高分辨率的洞察力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

vuecli创建vue3项目

第一步&#xff1a; 在文件夹中输入 vue create xxx 第二步&#xff1a; 勾选下面带有*号的&#xff0c;经验最好把Linter/Formatter勾掉&#xff0c;不然会出现eslint报错 第三步&#xff1a; 选择3.x 第四步&#xff1a; 意思为是否用history模式来创建路由&#xff0…

mineadmin前端安装启动

在上一篇文章中&#xff0c; 我们已经搭建好了后端环境并启动 mineadmin 快速安装部署&#xff08;docker环境&#xff09; 一、下载前端项目 1、在搭建后端时候&#xff0c;使用php bin/hyperf.php mine:install 的时候&#xff0c;有一个步骤是安装前端项目的。安装目录为&a…

【有源码】buildroot根文件系统编译和常见问题

前言 编译好的含有QT5等工具包的buildroot根文件 仓库&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver 编译过程如下 1.下载源码&#xff0c;解压tar -vxjf xxx.tar.bz2 https://buildroot.org/ 这里以如下版本实验 2.在解压之后的buildroot-2019.02.…

智慧公厕的系统构成与功能解析

智慧公厕系统是通过传感器和云平台相结合的创新技术&#xff0c;旨在提供更好的公厕管理与服务。智慧公厕从系统的构成来看&#xff0c;主要分为感知层&#xff08;数据收集&#xff09;、传输层&#xff08;数据传输&#xff09;、平台层&#xff08;数据处理&#xff09;和应…

【vue-小知识】var、let 和 const之间的区别

文章目录 结论1、重复定义变量名var&#xff1a;允许重复定义变量名let和const&#xff1a;不可以重复定义变量名 2、修改值var&#xff1a;允许修改值let&#xff1a;允许修改值const&#xff1a;不允许修改值&#xff0c;会报错 3、变量提升var : 支持变量提升let和const&…

查看VMWare ESXi 6.5/6.7服务器上 GPU直通的状态

VMWare ESXi 6.5/6.7服务器状态 查看配置参数

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

OFC2023活动剪影

马上就要OFC 2024了&#xff0c;应该有些新图可以发一发了 先发点老图&#xff0c;丢在这里&#xff0c;怕下次不知道去哪里找 以上是以太网联盟Ethernet Alliance 在OFC2023上展示的一个演示机柜 以下是我们参与OFC2023的剪影&#xff0c;除了参与EA的演示&#xff0c;还有独…

从错误中进行上下文学习

1、写作动机&#xff1a; 在上下文学习中&#xff0c;也称为少样本提示&#xff08;ICL&#xff09;&#xff0c;一直是调整LLM适应下游任务的标准方法&#xff0c;通过从少量输入-输出示例中学习。然而&#xff0c;所有基于ICL的方法都只从正确的输入-输出对中学习。 2、主要…

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此&#xff0c;软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…

基于ARM 的Linux系统的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在 MacOS 中安装 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告 本教程可以包含过时的信息。 此步骤已在 Ubuntu Linux 12.04 上进行了测试&#xff0c;但应…

JAVA 获取系统当前时间、时间格式互相转化工具类,2024百度Java岗面试真题收录解析

DateTimeFormatter ftf DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”); LocalDateTime parse LocalDateTime.parse(strTime, ftf); return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); } //通过LocalDateTime获取当…

【论文精读】OTA: Optimal Transport Assignment for Object Detection(物体探测的最优传输分配)

OTA最优传输 &#x1f680;&#x1f680;&#x1f680;摘要一、1️⃣ Introduction---介绍二、2️⃣Related Work---相关工作2.1 &#x1f393; Fixed Label Assignment--静态标签分配2.2 ✨Dynamic Label Assignment--动态标签分配 三、3️⃣Method---论文方法3.1 &#x1f39…