多态【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.hqwc.cn/news/611290.html

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

相关文章

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开…

数据可视化-ECharts Html项目实战(10)

在之前的文章中,我们学习了如何在ECharts中编写雷达图,实现特殊效果的插入运用,函数的插入,以及多图表雷达图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错&…

vue快速入门(十九)使用动态类绑定实现TabBar动态样式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 vue绑定动态样式根据点击事件获取当前点击部分序号 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…

spring快速搭建聊天AI

官网url: https://spring.io/projects/spring-ai 本文演示的是open AI 1创建java项目 2.拿到AI的key&#xff08;没有的话可以去淘宝花几块钱买一个&#xff09; //YOUR_API_KEY写你自己的open AI的key spring.ai.openai.api-keyYOUR_API_KEY spring.ai.openai.chat.options.…

STM32之FreeRTOS移植

1.FreeRTOS的移植过程是将系统需要的文件和代码进行移植和裁剪&#xff0c;其移植的主要过程为&#xff1a; &#xff08;1&#xff09;官网上下载FreeRTOS源码&#xff1a;https://www.freertos.org/ &#xff08;2&#xff09;移植文件夹&#xff0c;在portable文件夹中只需…

Github 2024-04-09 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Vue项目1JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

【通信原理笔记】【三】模拟信号调制——3.6 角度调制的抗噪声性能

文章目录 前言一、FM的解调二、FM的输出信噪比总结 前言 这一节内容介绍的是FM信号的抗噪声性能&#xff0c;与之前学的幅度调制不同&#xff0c;角度调制系统是非线性的&#xff0c;其信噪比的推导计算很多地方添加了假设&#xff0c;最后得到一个估计值。当初我学这部分内容…

C#如何用NPOI创建、读取、更新Excel文件

一.获取引用NPOI VS2017&#xff0c;通过Nuget工具包下载NPOI到指定的项目中&#xff0c;如下 二.添加如下命名空间,其中HSSF是操作*.xls文件&#xff0c;XSSF操作*.xlsx文件. using NPOI; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; …

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

linux进阶篇:下载工具wget的安装以及应用

1 wget工具介绍 wget是一个下载文件的工具&#xff0c;它用在命令行下。对于Linux用户是必不可少的工具&#xff0c;我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。 wget支持HTTP&#xff0c;HTTPS和FTP协议&#xff0c;可以使用HTTP代理。所谓的自动下载是指&a…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…