多态【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.mzph.cn/news/809468.shtml

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

相关文章

Linux下网络编程基础知识--协议

网络基础 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 协议 一组规则, 数据传输和数据的解释的规则。 比如说依次发送文件的文件名, 文件的大小, 以及实际的文件, 这样规定发送一个文件的顺序以及发送的每一个部分的格式等可以算是一种协议 型协议 …

防火墙用户管理技术——AAA

目录 一.AAA功能 (1).认证方式 (2).授权方式 (3).计费方式 二.RADUIUS协议 三.用户组织架构及管理 管理员认证登录方式 1.console 2.web 3.telnet 4.ssh 5.ftp 四.认证方式 五.AAA远程登录 1.端口添加IP地址达到互通 2.AAA视图进行配置 3.结果​编辑 一.AAA功能…

Android源码解析之截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程。用过android系统手机的同学应该都知道,一般的android手机按下音量减少键和电源按键就会触发截屏事件(国内定制机做个修改的这里就不做考虑了)。那么这里的截屏事件是如何触发的呢…

【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化

Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片与节点间通信机制,实现了水平扩展、高可用与数据容灾。本文将深入剖析Redis Cluster的工作原理、核心机制,并结合实战经验分享优化策略,为您打造坚实可靠的Redis分布式…

双数据库的安装

双MySQL的安装 【0】前言 ​ 本地已经安装过mysql5.1版本,应项目需求需要安装mysql5.7版本; ​ 官方网站下载对应版本:https://downloads.mysql.com/archives/community/ 【1】压缩包下载完成后解压至本地磁盘 【2】进入根目录下bin文件夹…

Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展,用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录,并管理他们的登录状态。flask_login 提供了用户认证的基础结构,但具体的用户验证(如用户名和密码检查)和存储…

泽众Testone自动化测试平台,测试用例支持单个调试执行,同步查看执行日志

泽众Testone自动化测试平台之前版本,测试用例批量和单个执行,必须要通过测试集操作执行,操作略繁琐,我们通过本轮优化升级,测试用例直接可以单个调试执行,同步查看执行日志,操作上去繁就简&…

OJ刷题日记:1、双指针(1)

目录 1、283.移动零 2、1089.复写零 3、202.快乐数 1、283.移动零 题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 …

第十届 蓝桥杯 单片机设计与开发项目 省赛

第十届 蓝桥杯 单片机设计与开发项目 省赛 输入: 频率信号输入模拟电压输入 输出(包含各种显示功能): LED显示SEG显示DAC输出 01 数码管显示问题:数据类型 bit Seg_Disp_Mode;//0-频率显示界面 1-电压显示界面 un…

电脑无法开机?原因分析与解决方案

电脑无法开机是一种常见的问题,可能会给用户带来诸多困扰。无法启动可能是由于硬件故障、软件问题或者其他未知原因引起的。在本文中,我们将介绍三种常见的方法来解决电脑无法开机的问题,以帮助用户尽快恢复正常使用。 方法1:检查…

什么是队列

队列是一种特殊类型的线性表,其只允许在一端进行插入操作,而在另一端进行删除操作。具体来说,允许插入的一端称为队尾,而允许删除的一端称为队头。这种数据结构遵循“先进先出”(FIFO)的原则,即…

ubuntu安装irtualbox注意事项

下载官网7.0版本,ubuntu22.04,安装一直出错误,查到了下面兄弟的办法,仍然不幸,最后使用apt重装,请按第二部分流程安装,安装6.1,可以用 第一部分,反正我是没搞通,7.0反复的出现相同的…

C语言读取 .ico 文件并显示数据

原来是想做光标编辑器&#xff0c;自己把绘图板的内容导出为光标格式 鼠标指针文件格式解析——Windows&#xff08;一&#xff09; (qq.com) 代码来源自 Icons | Microsoft Learn 鄙人又补充些变量可以运行微软的代码 简单代码如下 #include <stdio.h> #include &l…

神经网络模型底层原理与实现8-BERT

首先介绍什么是自监督学习&#xff1a; 普通的有监督学习是每个x对应有个y&#xff0c;x训练得到y&#xff0c;将y与y作比较&#xff0c;而自监督是没有对应y&#xff0c;直接把一部分样本x作为训练目标x&#xff0c;训练得x后和x对比 bert中如何创造x&#xff1a;以文字处理为…

4/11 QT_day5

服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QMessageBox> #include <QTcpSocket> #include <QList> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

MSTP/RSTP与STP的兼容性

原理概述 MSTP(Multiple STP)协议和RSTP(Rapid STP)协议都可以向下兼容STP&#xff08;Spanning Tree Protocol &#xff09;协议。运行MSTP/RSTP协议的交换机会根据收到的BPDU版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU&#xff0c;MSTP/RSTP交换机…

Oracle 21c 数据库迁移到DM8(达梦)数据库

一、环境准备 1、创建脚本 执行dmCreateUser.sql脚本创建GLJ用户&#xff08;注意&#xff1a;需要与需要迁移的oracle用户名一样&#xff09;&#xff0c;如&#xff0c;脚本内容如下&#xff1a; -- 开始将输出重定向到指定的日志文件 spool start /home/dmdba/dmdbms/sql/…

【Linux】sudo分权管理实战

一般sudo命令是默认安装的&#xff0c;如果你的机器里没有&#xff0c;可以使用命令 yum install sudo 来安装 [rootgaosh-64 ~]# yum install sudo 我们来看一下配置文件&#xff1a; 在上图root下面添加一行 &#xff0c;给gaosh用户加权限 [rootgaosh-64 ~]# vim /etc/su…

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统&#xff0c;具有可裁剪、跨平台、低功耗、高安全等特点&#xff0c;支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构&#xff0c;兼容POSIX、CMSIS等标准接口&#xff0c;支持Javascript、MicroPyt…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…