面向对象:多态

news2024/11/26 12:31:45

文章目录

    • 一、什么是多态
    • 二、构成多态的条件
      • 2.1什么是虚函数
      • 2.1如何构成虚函数的重写(原理层面上叫:覆盖)
      • 2.2父类指针的调用
    • 三、多态调用父类指针出现的情况
    • 四、构成多态的一种特殊情况(协变)
    • 五、析构函数构成的多态
    • 六、多态的原理
    • 七、多态的静态绑定和动态绑定
      • 7.1多态的静态绑定
      • 7.2多态的动态绑定
    • 八、单继承和多继承的虚函数表
    • 九、菱形虚拟继承
    • 十、override和final
      • 10.1override是检查派生类虚函数是否重写了基类的虚函数如果没有重写就编译报错
      • 10.2final是标明该虚函数不能重写
    • 十一、抽象类

在这里插入图片描述


先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
所属专栏:C++进阶
在这里插入图片描述

一、什么是多态

通俗来讲多态就是完成某一种行为,不同的对象会完成会产生不同的状态。
比如买票,针对不同的人群有不同的购票机制,对于儿童来说怎么样,对于大学生来说怎么样,这就是不同人群产生的不同状态机制
在这里插入图片描述

二、构成多态的条件

1.首先需要继承关系
2.然后就要构成虚函数的重写
3.接着需要用父类的指针或者引用去调用虚函数

2.1什么是虚函数

通过前面的虚拟继承我们得知在继承的父类前面加一个virtual就行了,那么虚函数也是如此,在普通函数前面加一个virtual就行了
在这里插入图片描述

2.1如何构成虚函数的重写(原理层面上叫:覆盖)

1.父类的虚函数和子类的虚函数的返回值,函数名,参数类型都必须相同
2.父类的虚函数必须加上virtual,子类可以加可以不加,不加virtual,但是返回值,函数名,参数类型都必须与父类相同,这样叫接口继承(也就是把父类的虚函数除了实现全部变成了子类的)

在这里插入图片描述

2.2父类指针的调用

在这里插入图片描述

三、多态调用父类指针出现的情况

指针指向谁就调用谁的函数
在这里插入图片描述
在这里插入图片描述
这里调用的是子类的虚函数

这里调用的是父类的虚函数
在这里插入图片描述

四、构成多态的一种特殊情况(协变)

协变构成的条件是:
父类和子类的函数的返回值不同,父类返回的是某个父类的指针,子类返回的是某个子类的指针,函数名和参数类型相同
在这里插入图片描述
在这里插入图片描述

五、析构函数构成的多态

由于编译器的特殊处理,虚函数的函数名都被处理为destructor
在这里插入图片描述

六、多态的原理

在描述原理之前,我们先看一个问题

在这里插入图片描述
这里打印的结果是多少呢?
我们首先考虑的是内存对齐的规则首先想到的肯定是8,但是这里打印的是12

在这里插入图片描述
为什么呢?我们来看看监视窗口的情况
在这里插入图片描述
这里我们发现出现了一个指针,为什么会有这个指针呢?
其实这个指针叫做虚函数表指针(虚表指针),用来存储虚函数表(虚表指针)的,也就是说虚函数的地址是存在虚函数表中的

同时也引发了另一个问题:虚函数表又是什么?
虚函数表实际上是虚函数指针数组,里面存储的是虚函数的地址,从这个地址中可以找到虚函数。

在这里插入图片描述
在这里插入图片描述

七、多态的静态绑定和动态绑定

7.1多态的静态绑定

静态绑定又称为前期绑定,也就是程序在编译的时候就已经确定了程序的行为,也称为静态多态
比如函数重载

7.2多态的动态绑定

动态绑定又称为后期绑定,也就是程序在运行的期间,根据具体拿到的类型进行确定程序的行为,调用具体的函数,也称为动态多态

八、单继承和多继承的虚函数表

这里我们需要关注的是多继承的虚函数表,因为刚刚单继承的虚函数表已经研究过了,这里不过多赘述
在这里插入图片描述
在这里插入图片描述
这里我们可以看到在监视窗口并无法观察到派生类的所有虚函数的地址情况,所以我们写一个程序来观察派生类的所有虚函数的地址
在这里插入图片描述
这里VS在每个虚函数表指针中的末尾都加了一个nullptr,我们利用这个特性打印出base中virtual func3和virtual func4存在哪一个虚表中
由于谁先继承相等于谁先声明,先声明的先打印,后继承的后打印。我们可以看到如图:
在这里插入图片描述
明显可以看出存在先声明的A中的虚表中

九、菱形虚拟继承

在这里插入图片描述
在这里插入图片描述
通过最下面的C的虚表指针的地址可以判断出A和B中的虚表指针在每个父类的第一行
在这里插入图片描述

十、override和final

10.1override是检查派生类虚函数是否重写了基类的虚函数如果没有重写就编译报错

在这里插入图片描述

10.2final是标明该虚函数不能重写

在这里插入图片描述

十一、抽象类

包含纯虚函数的类叫做抽象类,抽象类无法实例化出对象,继承了抽象类的派生类也是抽象类
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++AVL树拓展之红黑树原理及源码模拟

前言&#xff1a;我们之前已经从零开始掌握AVL树http://t.csdnimg.cn/LaVCChttp://t.csdnimg.cn/LaVCC 现在我们将继续学习红黑树的原理并且实现插入等功能&#xff0c;学习本章的前提要求是掌握排序二叉树和AVL树&#xff0c;本章不再提及一些基础知识&#xff0c;防止本文结…

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色&#xff0c;它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换&#xff0c;还是复杂的应用导航&#xff0c;导航栏都能够帮助用户快速找到所需内容&#xff0c;提升用户体验和应用的易用性。 在移动应用…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

华为OD机试 - 芯片资源限制(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意&#xff1a;订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发&#xff0c; 用户勾选 “总是保持以上选择&#xff0c;不再询问” 之后或长期订阅&#xff0c;下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…

爬虫的验证码处理

1.我们先进入chrome浏览器的审查页面找到input方法&#xff1a; 为了不少找到一个input&#xff0c;我们ctrlf的方法输入input来查找 看见我们有6个需要输入的参数。 除了上面几个的input参数&#xff0c;我们还需要获取验证码的图片&#xff0c;后续要将字母填入进去。 二.安…

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…

Vue ElementPlus Form、Form-item 表单

Form 表单 由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、校验、提交数据&#xff0c;组件升级采用了 flex 布局&#xff0c;以替代旧版本的 float 布局。 典型表单 包括各种表单项&#xff0c;比如输入框、选择器、开关、单选框、多选框等。 在 Form 组件…

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 &#xff08;增&#xff09;直接添加放到最后即可。按顺序添加&#xff1a;找到要修改的节点的前一个节点&#xff0c;插入新节点&#xff08;&#xff09;。&#xff08;改&#xff09;要修改的节点修改内容即可。&#xff08;…

03-MySQl数据库的-用户管理

一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …

Docker:使用MinIO搭建对象存储平台

请关注微信公众号&#xff1a;拾荒的小海螺 1、简述 MinIO是一个基于对象存储技术的开源项目&#xff0c;它可以帮助用户快速搭建起私有的、高性能的对象存储平台。MinIO兼容Amazon S3 API&#xff0c;使得用户可以使用标准的S3工具和SDK来访问和管理MinIO存储的数据。此外&a…

查找--二分查找(Binary Search)

二分查找属于静态查找表&#xff0c;当以有序表表示静态查找表时&#xff0c;查找函数可用折半查找来实现。 查找过程&#xff1a;先确定待查记录所在的范围&#xff08;区间&#xff09;&#xff0c;然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

B样条曲线(记录)

B样条曲线的生成靠的两点&#xff1a; 1、控制点 2、基函数 B样条曲线的基函数是一个De Boor的递归表达式[1]&#xff1a; (1) (2) 其中是第个阶基函数。 而B样条曲线可以表示为[2]&#xff1a; (3) 如何理解上式&#xff1f;首先&#xff0c;我们知道&#xff0c;如果一个函数…

高端的电子画册,手机打开你见过吗?

手机阅读的高端电子画册&#xff0c;你见过吗&#xff1f;随着移动互联网的发展&#xff0c;越来越多的人选择在手机上阅读电子画册&#xff0c;而不是传统的纸质画册。这种趋势不仅节省了纸张资源&#xff0c;还提升了阅读体验。用户可以通过触摸屏幕、放大缩小、翻页等操作与…

【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

区块链浏览器概述 区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据&#xff0c;然后使用数据库来排列搜索到的数据&#xff0c;并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项&#xff0c;然后通过数据库上…

empdll文件安装在哪里,详细的修复教程分享

在我们运行《荒野大镖客2》游戏的时候&#xff0c;有些玩家在游玩过程中可能会遇到emp.dll文件丢失的问题。此文件作为游戏运行过程中不可或缺的动态链接库&#xff08;DLL&#xff09;组件之一&#xff0c;丢失会导致游戏无法正常运行。小编将介绍5种解决emp.dll文件丢失的方法…

linux安装Zookeeper的详细步骤

1.Java环境确认 确保已经安装了Java环境&#xff0c;没有的自行安装 2.官网下载包 Apache ZooKeeper 3.安装 3.1上传到linux&#xff0c;解压 我的目录为/root/apache-zookeeper-3.8.4-bin 进入到/root/apache-zookeeper-3.8.4-bin/conf目录下&#xff0c;执行命令复制zoo…

C++2D原创我的世界1.00.3版本上市!!!

我很郁闷&#xff0c;为什么就是整不了昼夜交替啊喂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 虽然这看上去很简单&#xff0c;但做起来要我命&#xff01;&#xff01;&#xff01; 优化过后总共1312行&#xff0c…

微信公众号迁移公证书在哪?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;很多小伙伴想做公众号迁移&#xff0c;但是不知道公众号迁移有什么作用&#xff0c;今天跟大家具体讲解一下。首先公众号迁移最主要的就是修改公众号的主体了&#xff0c;比如我们公众号原来是A公司的&#xff0c;现…

指针强化练习(详解)

更多学习内容 结构体内存对齐 和 位段-CSDN博客指针初级&#xff08;基础知识&#xff09;-CSDN博客指针进阶(深入理解)-CSDN博客 目录 1.sizeof与strlen的区别 2.一维数组 3.字符指针 4.二维数组 5.指针运算(笔试题) 6.函数指针 1.sizeof与strlen的区别 请思考以下运行结…