【C++】多态(多态的构成条件,虚函数重写,override,final,覆盖隐藏对比)

news2024/12/23 13:15:36

文章目录

  • 前言
  • 一、多态的定义及实现
    • 1.多态的构成条件:
  • 二、虚函数
    • 1.虚函数的重写
    • 2.虚函数重写的例外(协变)
    • 3.析构函数的虚函数(基类与派生类析构函数名字不同)
      • 1.不加virtual的一般情况:
      • 2.不加virtual会出现异常的情况
      • 3.析构函数加上virtual后
  • 三、C++11 override 和 final
    • 1.override
    • 2.final
  • 四、 重载、覆盖(重写)、隐藏(重定义)的对比
  • 小试牛刀


前言

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

举个栗子:多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

一、多态的定义及实现

1.多态的构成条件:

  1. 必须通过基类的指针或者引用调用虚函数
  2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
    在这里插入图片描述

二、虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数。

1.虚函数的重写

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

在这里插入图片描述

2.虚函数重写的例外(协变)

协变(基类与派生类虚函数返回值类型不同)派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。(基类虚函数不能返回派生类的指针或者引用,派生类虚函数也不能返回基类的指针或者引用)

class A
{};

class B : public A
{};

class Person {
public:
	virtual	A* BuyTicket() const { 
		cout << "买票-全价" << endl;
		return 0;
	}
};

class Student : public Person {
public:
	virtual B* BuyTicket() const { 
		cout << "买票-半价" << endl;
		return 0;
	}
};

3.析构函数的虚函数(基类与派生类析构函数名字不同)

问:析构函数加virtual,是不是虚函数重写?
答:是, 因为类析构函数都被处理成destructor这个统一的名字

问:为什么要这么处理呢?
答:因为要让他们构成重写

1.不加virtual的一般情况:

在这里插入图片描述

2.不加virtual会出现异常的情况

在这里插入图片描述

3.析构函数加上virtual后

加上virtual以后我们就可以根据指针指向的类型利用多态去调用对象对应的析构函数
如果只是普通的析构,他只会根据对象的类型去调用类型对应的析构函数

在这里插入图片描述

三、C++11 override 和 final

1.override

检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。

在这里插入图片描述

2.final

1.修饰虚函数,表示该虚函数不能再被重写
在这里插入图片描述

2.设计不想被继承的类
在这里插入图片描述

四、 重载、覆盖(重写)、隐藏(重定义)的对比

在这里插入图片描述

小试牛刀

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Merge和Rebase的区别

Merge 和 Rebase 是 Git 中常用的两种分支整合方式&#xff0c;它们具有不同的工作原理和效果&#xff1a; Merge&#xff08;合并&#xff09; 合并是将两个或多个分支的提交历史合并为一个新的提交。在合并时&#xff0c;Git 会创建一个新的合并提交&#xff0c;将两个分支…

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…

让你的商城触达全球市场!了解跨境商城系统源码的优势

全球市场触达的商机 随着全球化趋势的不断发展&#xff0c;跨境电商已经成为企业开拓全球市场的重要途径之一。在扩大国际业务的同时&#xff0c;企业需要面对许多挑战&#xff0c;如语言、支付、物流等问题。这些问题可以通过使用跨境商城系统源码来解决。 一、多语言支持 跨境…

如何做好电信布线?

电信布线作为通信网络骨干&#xff0c;对于任何现代企业或组织来说都是至关重要的组成部分。随着业务量的持续增长&#xff0c;对电信布线安装提出了更高的要求。为此&#xff0c;飞速&#xff08;FS&#xff09;提出了FHD电信布线解决方案&#xff0c;在满足了电信机房要求的基…

源码分析——ConcurrentHashMap源码+底层数据结构分析

文章目录 1. ConcurrentHashMap 1.71. 存储结构2. 初始化3. put4. 扩容 rehash5. get 2. ConcurrentHashMap 1.81. 存储结构2. 初始化 initTable3. put4. get 3. 总结 1. ConcurrentHashMap 1.7 1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图&#xff0c;Concurr…

【Vue3】localStorage读取数组并赋值的问题

问题描述 今天在写项目用到localStorage进行存储并读取数据&#xff0c;并将读取到的数据存放到列表的时候&#xff0c;发现vue3不能直接对数组进行赋值。因为Vue3的响应式是proxy&#xff0c;对所有的数据进行了拦截。 onBeforeMount(() > {console.log(JSON.parse(local…

C语言学习笔记 使用vscode外部console出现闪退-12

前言 在使用vscode的外部console时&#xff0c;会出现闪退现象&#xff0c;这是因为程序运行结束后&#xff0c;系统自动退出了终端&#xff08;终端机制决定的&#xff09;。我们可以在C程序结束后&#xff0c;使用system函数来暂停DOS终端系统&#xff0c;这样就可以完整地看…

中间件插件机制

一、插件 在mybatis一类中间件在处理的时候&#xff0c;提供了插件机制&#xff0c;类似于aop机制&#xff0c;可以在方法前、方法后进行拦截并且修改入参获得改变其方法的行为。那么调用的的方法应该也需要使用动态代理活动被插件进行aop的对象。

GD32F103硬件I2C0通讯

GD32F103的I2C模块有I2C0和I2C1;本程序使用I2C0功能模块; I2C0引脚复用和重映射: 当I2C0_REMAP0时,I2C0引脚复用功能,I2C0_SCL映射到PB6引脚,I2C0_SDA映射到PB7引脚; 当I2C0_REMAP1时,I2C0引脚重映射,I2C0_SCL映射到PB8引脚,I2C0_SDA映射到PB9引脚; I2C1引脚只有复用引脚: I2C…

Nevron Vision for .NET Crack

Nevron Vision for .NET Crack NET Vision是一个用于创建具有数据可视化功能的强大数据表示应用程序的套件。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、众多功能和高质量的演示使复杂数据的可视化变…

观察级水下机器人使用系列之四二维前视声纳

本文主要讲观察级水下机器人Valor配套的二维前视声纳&#xff0c;它与超短基线定位、摄像头都是水下机器人导航的重要部件。二维声纳是Tritech公司生产的&#xff0c;型号为Gemini 720is。 ​编辑​ Gemini 720is主要技术参数见下表。 Gemini 720is通过一条蓝色的缆与机器人的…

Linux命令200例:wc用于统计文本文件中的字数、行数和字符数(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

字节C++后端面试总结

字节的面经,技术栈是 C++ 后端。 计算机网络 UDP和TCP区别 先说了概念一个是面向连接的基于字节流的可靠连接,一个是不需要连接的基于数据报的不可靠传输 然后说了几个小点,比如首部长度、应用场景、服务对象什么的。 补充: 还有一个很重要的点:UDP 的实时性比 TCP 好…

【培训】第一届深圳AI视觉项目研发与部署免费线下公开课启动!2023年8月底与我们相约,开启AI视觉之旅!...

人工智能&#xff08;AI&#xff09;时代来临&#xff0c;随着技术更新迭代&#xff0c;各行各业都因为深度学习技术而发生变革&#xff0c;技术人员的能力也需要不断更新。面向AI入门者&#xff0c;我们将在2023年下半年开启定期的线下教学&#xff0c;提供深度学习核心方法与…

网络安全进阶学习第十五课——Oracle SQL注入

文章目录 一、Oracle数据库介绍二、Oracle和MySQL的语法差异&#xff1a;三、Oracle的数据库结构四、Oracle的重点系统表五、Oracle权限分类1、系统权限2、实体权限3、管理角色 六、oracle常用信息查询方法七、联合查询注入1、order by 猜字段数量2、查数据库版本和用户名3、查…

MySQL之深入InnoDB存储引擎——redo日志

文章目录 一、为什么需要redo日志二、redo日志的类型1&#xff09;简单的redo日志类型2&#xff09;复杂的redo日志类型 三、Mini-Transaction四、redo日志的写入过程五、redo日志文件1、刷盘时机2、redo日志文件组 六、log sequence number1、lsn的引入2、flushed_to_disk_lsn…

MQTT消息传输过程,网络断开后,断线重连及订阅消息恢复

1&#xff0c;首先要在网络失败的地方进行client重连 2&#xff0c;一定要设置发送超时&#xff0c;默认是-1&#xff0c;是不断进行发送的&#xff0c;会被长阻塞在这里&#xff0c;单位是ms 3&#xff0c;参考链接 https://vimsky.com/examples/detail/java-method-org.ec…

实现 cpolar 内网穿透

简介 cpolar是一种安全的内网穿透云服务&#xff0c;可以将内网下的本地服务器通过安全隧道暴露至公网&#xff0c;使得公网用户可以正常访问内网服务。它是一款内网穿透软件&#xff0c;使用简单&#xff0c;只需一行命令即可将内网站点发布至公网&#xff0c;方便给客户演示…

【100天精通python】Day29:文件与IO操作_JSON文件处理

目录 专栏导读 一、XML文件概述 1. 标签和元素 2. 嵌套结构 3. 属性 4. 命名空间 5. CDATA节 6. 注释 7. 验证与验证语言 8. 扩展性 二、XML文件处理常见操作 1. 解析XML文件 2. 创建和编辑XML文件 3. 修改XML文件 4. 查询XML元素 5 遍历XML元素 6. 删除XML元…

嵌入式虚拟仿真实验教学平台之串口发送数据

嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器&#xff0c;串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…