多态【C/C++复习版】

目录

一、多态是什么?如何实现?

二、 什么是重写?有什么特点?

 三、什么是协变?

四、析构函数能实现多态吗?为什么要实现?

五、override和final的作用是什么?

六、 多态的原理是什么?虚表/虚函数表

七、虚表保存在哪里?

八、坑题

九、多态分几种?哪几种?

十、多继承+虚函数重写(多个父类的类会有几个虚表?)


一、多态是什么?如何实现?

多态:不同的对象调用一个同名函数时,实际调用的是不同的函数,会有不同的行为或结果,比如:高铁票买票时有学生票和成人票。

可以通过虚函数来实现:父类定义了虚函数(用virtual修饰的函数),子类重写该函数,通过基类的指针或引用来调用虚函数。

构成多态的两个条件:①重写了虚函数 ②通过父类的指针或引用调用虚函数

二、 什么是重写?有什么特点?

重写(覆盖)是指在派生类中有一个跟基类返回值,函数名,形参列表相同(缺省参数除外)的虚函数。

重写时,只是重写函数体的部分,函数头用的是父类的,也就是说,如果有的话,缺省参数也是用的父类的。派生类重写时,可以不加virtual。

 三、什么是协变?

虚函数返回值不同时,必须满足协变。协变的返回值可以不同,但协变的返回值必须是父子关系(不一定是当前的父子类,可以是任意别的父子类)的指针或引用(同时是指针或同时是引用)。

四、析构函数能实现多态吗?为什么要实现?

1)析构函数加上virtual关键字是可以实现多态的,虽然表面上看他们名字不同,但实际上编译器会将析构函数的名字统一处理成destrutor。

2)如果析构函数不实现多态,会出现下面的问题:一个父类指针类型有可能指向父类,也有可能指向子类,实现多态才能在delete这个指针时,调用它真正指向的类型的析构函数。

五、override和final的作用是什么?

1)override关键字用于显式地声明一个成员函数是重写其基类中的虚函数,以确保正确的多态行为,可以增加代码的可读性,并且在子类中改写基类的虚函数时会让编译器在发现错误时给出警告或错误提示,有助于避免因为拼写错误或其他原因导致的潜在问题。

2)final可以用来修饰一个类或一个函数:

修饰一个类时,表示该类不可被继承。

修饰一个函数时,表示该函数不可被重写。

扩:不用final,如何让一个类不可被继承?

将构造函数私有化,并设置一个静态成员函数来调用其私有的构造函数。

六、 多态的原理是什么?虚表/虚函数表

1)父类中会有一个虚函数表指针类型的成员,创建父类对象后,该指针指向父类的虚函数表,该虚函数表保存的是父类虚函数指针;

2)子类继承父类后,会通过继承得到一个虚函数表指针类型的成员,创建子类对象后,该指针指向子类的虚函数表,该虚函数表保存的是子类虚函数指针。

同一个类的多个对象中的vfptr(虚函数表指针)指向的是同一个虚函数表。

下图可以验证上面的说法:

当test(p)执行时,pp是p对象的引用,pp看到的是这一部分(父类的虚函数表):

当test(s)执行时,pp是s对象的切片,pp看到的是这一部分(子类的虚函数表):

七、虚表保存在哪里?

验证猜测是在常量区。

八、坑题

正确答案是:B

九、多态分几种?哪几种?

多态分为静态多态和动态多态:

① 静态多态又称静态绑定,是指在程序编译期间就确定了程序的行为。(函数重载)

② 动态多态又称动态绑定,是指在程序运行期间才确定程序的行为。(继承、虚函数重写)

十、多继承+虚函数重写(多个父类的类会有几个虚表?)

 Derive对象是多大?有几个虚表指针?

20字节,两个虚表指针。

为什么Derive对象重写fun1后,两个虚表保存的函数指针不一样,调用的结果是同一个?

上面这段代码中,ptr123调用的都是同一个函数,也就是d对象的func1,而调用d对象的成员函数是要给它传d对象的this指针的,对于ptr1,由于它的地址与d对象的地址是刚好重合的,所以其虚函数表里保存的func1的地址就是真正的地址;ptr2则需要重新修正this指针的位置,让其指向d对象的起始地址。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回:SQLite—系列文章目录 上一篇:SQLite---调试提示(十九) 下一篇:SQLite—系列文章目录 ​ SQLite 版本 3.5.0 (2007-09-04) 引入了一个新的操作系统接口层, 与所有先前版本的 SQLi…

ELK 日志分析系统(一)

一、概念 二、详解 2.1 Elasticsearch 核心概念 2.1.1 接近实时(NRT) 2.1.2 cluster集群 2.1.3 Node节点 2.1.4 index索引 2.1.5 类型(type) 2.1.6 文档(document) 2.1.7 分片和副本(shards & replicas) 2.2 Logstash主要组件 …

个人博客系统项目(SpringBoot+Linux部署上线)

在学完SpringBoot框架、MyBatis后,直接开始做第一个项目:博客系统 首先,该博客系统包含核心功能有: 一、登录、注册、退出登录功能。 二、没有登陆前可以查看博客首页以及博客展示的分页处理,以及点击查看博客可以…

windows下pycharm中配置conda虚拟环境

目录 一:背景 二:安装conda环境 三:pycharm配置环境 四:注意问题 一:背景 在使用python的过程中,我们可能需要在一个windows环境中创建多个版本的python和安装不同的库去做一些开发任务。 使用conda&a…

IDEA2023 开发环境配置

目录 1. 关闭IDEA自动更新1.2 IDEA 新版样式切换 2. Maven配置2.1本地仓库优先加载2.2 maven.config配置文件中 3. 全局配置JDK4. 配置文件编码:UTF-85. 开启自动编译(全局配置)6. 开启自动导包7. 开启鼠标悬浮(提示文档信息)8. 设…

10分钟1000台虚机 云安全效能双升 亚信安全新信舱无代理云平台快速适配版正式发布

新信舱 亚信安全新信舱无代理云平台快速适配版正式发布。在云平台依赖性、无代理部署速度、宿主机无代理AV防护和虚拟机缓存扫描性能等方面,新信舱无代理版本提供了无缝的可扩展性、低资源消耗并降低管理复杂性,让安全防护真正做到了 多快好省&#xff…

Rust语言入门第二篇-Cargo教程

文章目录 Rust语言入门第二篇-Cargo教程一,Cargo 是什么二,Cargo教程Cargo.toml文件src/main.rs 文件构建并运行Cargo项目 Rust语言入门第二篇-Cargo教程 本节提供对cargo命令行工具的快速了解。我们演示了它为我们生成新包的能力,它在包内编…

基于Leaflet.js的Marker闪烁特效的实现-模拟预警

目录 前言 一、闪烁组件 1、关于leaflet-icon-pulse 2、 使用leaflet-icon-pulse 3、方法及参数简介 二、闪烁实例开发 1、创建网页 2、Marker闪烁设置 3、实际效果 三、总结 前言 在一些地质灾害或者应急情况当中,或者热门预测当中。我们需要基于时空位置来…

ActiveMQ + MQTT 集群搭建(虚机版本) + Springboot使用配置

文章目录 前言一、ActiveMQ、 MQTT是什么?1.ActiveMQ介绍2.MQTT介绍 二、集群搭建步骤1.下载apache-activemq-5.15.12-bin.tar.gz2.上传apache-activemq-5.15.12-bin.tar.gz到服务器并解压文件到文件夹clusters、master、slave三个文件夹下面形成三个节点&#xff0…

C++ stl容器string的底层模拟实现

目录 前言: 1.成员变量 2.构造函数与拷贝构造函数 3.析构函数 4.赋值重载 5.[]重载 6.比较关系重载 7.reserve 8.resize 9.push_back,append和重载 10.insert 11.erase 12.find 14.迭代器 15.流插入,流提取重载 16.swap 17.c_str 18.完…

信道延迟的计算方法

目录 1.信道延迟影响的因素 2.计算公式 3.实践理解 4.基础知识 1.信道延迟影响的因素 因素1:与源端和宿端距离; 因素2:具体信道中的信号传播速率有关; 2.计算公式 总延迟 T发送延迟T1(信号传播速率) 线路…

21 - 寄存器控制器

---- 整理自B站UP主 踌躇月光 的视频 1. 程序计数器 PC 改造 原来的 PC 由于后续的 ALU 会较频繁的变动,因而会经常修改 PC,所以将 PC 中的 ALU 换成 8 位加法器。改造后的 PC: 2. 寄存器控制器的实现 我们控制器主要通过 ROM 实现&#xf…

FreeBuf 全球网络安全产业投融资观察(3月)

综述 据不完全统计,2024年3月,全球网络安全市场共发生投融资事件53起,其中国内4起,国外49起。 3月全球络安全产业投融资统计表(数据来源:航行资本、36氪) 整体而言,国内4起投融资事…

(2022级)成都工业学院数据库原理及应用实验三:数据定义语言DDL

唉,用爱发电连赞都没几个,博主感觉没有动力了 想要完整版的sql文件的同学们,点赞评论截图,发送到2923612607qq,com,我就会把sql文件以及如何导入sql文件到navicat的使用教程发给你的 基本上是无脑教程了,…

Stable Diffusion之Ubuntu下部署

1、安装conda环境 conda create -n webui python3.10.6 2、激活环境 每次使用都要激活 conda activate webui 注意开始位置的变换 关闭环境 conda deactivate webui 3、离线下载SD 代码 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/Stabilit…

华为OD技术面试-有序数组第K最小值

背景 2024-03-15华为od 二面,记录结题过程 有序矩阵中第 K 小的元素 - 力扣(LeetCode) https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/ 题目 给你一个 n x n 矩阵 matrix ,其…

从 Oracle 到 MySQL 数据库的迁移之旅

文章目录 引言一、前期准备工作1.搭建新的MySQL数据库2 .建立相应的数据表2.1 数据库兼容性分析2.1.1 字段类型兼容性分析2.1.2 函数兼容性分析2.1.3 是否使用存储过程?存储过程的个数?复杂度?2.1.4 是否使用触发器?个数&#xff…

Redis从入门到精通(十三)Redis分布式缓存(一)RDB和AOF持久化、Redis主从集群的搭建与原理分析

文章目录 第5章 Redis分布式缓存5.1 Redis持久化5.1.1 RDB持久化5.1.1.1 执行时机5.1.1.2 bgsave原理 5.1.2 AOF持久化5.1.2.1 AOF原理5.1.2.2 AOF配置5.1.2.3 AOF文件重写 5.1.3 RDB和AOF的对比 5.2 Redis主从5.2.1 搭建主从结构5.2.2 主从数据同步原理5.2.2.1 全量同步5.2.2.…

VMware导出虚拟机vmkd格式转换qcow2

VMware虚拟机导出qcow2格式可以上传至云服务 1、需要导出的虚拟机 2、克隆虚拟机 3、选择克隆源 4、创建完整克隆 5、完成 6、找到VMware安装路径 7、找到vmware-vdiskmanager所在路径使用cmd或Windows PowerShell进入目录 进入vmware-vdiskmanager目录 cd F:\软件\VMware Wo…

结合ArcGIS+SWAT模型+Century模型:流域生态系统水-碳-氮耦合过程模拟

原文链接:结合ArcGISSWAT模型Century模型:流域生态系统水-碳-氮耦合过程模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&tempkeyMTI2NV9sMGRZNUJoVkNVc1ZzSzRuMl9XXzhqX0R3cXpESWFwM1E4cFY4ejNqWFh3VUl0dlZkNWk4b20ydFdFTy1xS2ZObGN0Z0ZXSjly…