C++(多态上)

news2024/12/23 6:35:30

目录:

        1.多态的概念

        2.多态的定义和实现

        3.虚函数构成重写的特例

        4.剖析一道非常经典的题

        5.剖析多态的原理

-------------------------------------------------------------------------------------------------------------------------

 1.多态的概念

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

 

2.多态的定义

关键字virtual    --   虚函数

 构成虚函数的重写(覆盖) :(虚函数)+ 三同 (函数名、参数、返回值)

不符合重写,就是隐藏关系

虚函数构成重写只是构成多态的其中一种条件

第二个条件父类指针或者引用去调用函数

这里要是不构成多态,那么p.BuyTicket(),调用的就全是父类当中的那个BuyTicket(),这里st对象、sd对象传参给Func都发生了切片

但是这里构成了多态,也发生了切片,但是呢构成了多态,跟p的类型就没有关系,而是看它传过来指向的对象了

---------------------------------------------------------------------------------------------------------------

如果我们把不是用父类的指针或者引用去调用函数呢???

 那如果我们的虚函数不构成重写呢

 3.虚函数构成重写的特例

去掉子类的virtual虚函数

 为什么呢  ???

把子类的virtual去掉,还是认为它是虚函数,原因是因为

 

参数不同

 返回值也还有一个特例

重写的协变。返回值可以不同,要求必须是父子关系的指针或者引用

 

 但是返回的可以是其它父子关系的指针或引用

 父返回的必须是父类指针,子返回的必须是子类指针

4.剖析一道非常经典的题

 A.A->0     B.B->1      C.A->1        D. B->0     E.编译错误   D.以上都不正确

 func调用的肯定是子类的,最主要的这里的val是谁的

这里的val是父类的

虚函数重写是接口继承(把函数的函数名,参数、返回值继承下来)重写实现

普通函数继承是实现继承()

 5.剖析多态的原理

为什么多态能实现指向谁就调用谁呢????

我们先看一个小问题      ---  Base是有多大呢

这样子看的话,我们一般会认为是8字节   ,为什么呢 内存对齐嘛。整形的大小是4字节,然后char的大小是1字节,加起来5字节,不过呢内存对齐嘛,以4字节内存对齐,Base的大小得是4的整数倍。

 可一看却是12字节,和我们算的不一样

可是这里考察的不是内存对齐,考察的是多态

Base类型的对象里,会多存一个指针,指针指向的是虚表(虚表指针)

 我再增加几个虚函数,我们来看看它会不会进入我们的虚表呢???

 那么我们的多态的原理(是如何做到指向谁就调用谁的),我们先简单讲讲

首先虚函数会存进虚表,对象里没有虚函数,有的只是虚表的指针

 

 可是构成多态又是如何实现指向谁就调用谁的呢???

 

 总结 :多态的本质原理,符合多态的两个条件

那么调用时,会到指定对象的虚表中找到对应的虚函数地址,进行调用

多态调用是程序运行时去指向对象的虚表中找到函数的地址,进行调用

普通函数的调用,编译或链接时,确定函数的地址,运行时直接调用

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

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

相关文章

嵌入式开发--无刷电机学习2--克拉克变换

克拉克变换 首先说明,有很多方法,在数学上是等价的,比如33333*412。下面说的事情也是。 为了更简明的控制,克拉克女士提出电机控制简化的方法,即建立一个坐标系,横轴是α 纵轴是β,并将三相电…

RabbitMQ入门Demo 简单模式

出现的问题,原本4个操作,要么全部执行,要么全部不执行------->强一致性 但是现在分开了-----------最终一致性 强一致性:指在消息传递的过程中,系统会确保每个消息被精确地按照发送的顺序被传递,并且每个消息都会被正确地处理。强一致性…

重大问题,Windows11出现重大BUG

重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…

模拟比较器(Comparator)

概述 ⚫ 两个比较器,Comp1为低功耗比较器,Comp2为rail-to-rail快速比较器 ⚫比较器负端输入为vref或者IO输入,比较器正端为IO输入 ⚫ Buffer有Bypass功能,Bypass使能有效则不经过Buffer直接输入至比较器 ⚫ Buffer有1/2分压功能 ⚫…

JSON.stringfy() 和 qs.stringfy()区别 以及post/get 的参数形式

axios中post请求 application/json和 application/x-www-form-urlencoded 前端向后端传输数据时,如果是get传输,直接传在url后;如果是post传输,则在请求体body中传输。 在body中的数据格式又有两种,一种是 json 数据…

【Linux】教你用进程替换制作一个简单的Shell解释器

本章的代码可以访问这里获取。 由于程序代码是一体的,本章在分开讲解各部分的实现时,代码可能有些跳跃,建议在讲解各部分实现后看一下源代码方便理解程序。 制作一个简单的Shell解释器 一、观察Shell的运行状态二、简单的Shell解释器制作原理…

Python+Yolov8+Deepsort入口人流量统计

程序示例精选 PythonYolov8Deepsort入口人流量统计 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov8Deepsort入口人流量统计>>编写代码&#xff0c;代码整洁&#x…

[java]云HIS运维运营分系统功能实现(springboot框架)

运维运营分系统 一级菜单包括&#xff1a;系统运维、综合监管、系统运营 系统运维包括二级菜单&#xff1a;环境管理、应用管理、菜单管理、接口管理、任务管理、配置管理 综合监管包括二级菜单&#xff1a;综合监管 系统运营包括二级菜单&#xff1a;机构管理、药品目录管…

计算机组成原理4.2.3提高存储器访问速度的措施

提高存储器访问层次大概有三种方法 采用高速器件 采用层次结构 Cache 主存 调整主存结构 调整存储结构 单体多字系统 利用程序局部性原理&#xff0c;访问一个块 相邻的若干块都会被拿出来&#xff0c;缺点可能会碰到跳转类指令 多体并行系统 高位是体号&#xff0c;低位时地…

手动搭建高可用的 kubernetes 集群(v1.16.6)

手动搭建高可用的 kubernetes 集群(v1.16.6) 目录 手动搭建高可用的 kubernetes 集群(v1.16.6) 1、组件版本和配置策略 1.1 主要组件版本1.2 主要配置策略2、初始化系统和全局变量 2.1 集群规划2.2 初始化系统环境 2.2.1 关闭防火墙2.2.2 关闭 swap 分区2.2.3 关闭 SELinux2.2.…

【网络技术】什么是CNI

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 Never look back unless you are planning to go that way. 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用…

2023年第十五届华中杯赛题A题详细版思路 新型镇静药物临床实验疗效分析与预测

2023年五一假期期间&#xff0c;数学建模竞赛就有四场&#xff0c;各种比赛各种需求应接不暇。因此&#xff0c;对于本次浅析有不足的地方欢迎大家指出。为了更好的帮助大家华中杯参赛&#xff0c;下面带来&#xff0c;A题详细版思路 问题一&#xff0c;差异性分析 文字分析&a…

JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】

运行环境: jdk1.8idea/eclipsemaven3mysql5.6 项目技术: Java,Springboot,mybatis,mysql,jquery,html 该系统为停车场管理人员提供了对停车场中车辆&#xff0c;车位和财务的管理。操作员可以灵活地使用相关权限开展工作。在车位管理&#xff0c;车辆的停放和驶离、缴费&a…

理解Hopcroft DFA最小化算法

问题引入 在构造编译器的Scanner时&#xff0c;常见的解决方法是使用自动机技术。从文法构造出的DFA的状态数过多会影响编译器的性能。DFA中有一些状态本质上是等价的&#xff0c;我们需要一种自动化算法用于最小化DFA。 算法介绍 常见的DFA最小化算法有三种&#xff0c;分别…

栈和队列的转换

在之前的博客当中我们已经学习了栈和队列。在本次的博客当中我们就来学习一下怎么将栈和队列进行相互转换。 栈和队列的相互转换其实是两道OJ题。如果在leetcode上面刷过题的小伙伴们可能早就见过这两种数据结构的相互转换。下面我们就来分别讲解一下这两道OJ题目的编写思路。 …

为生信写的Python简明教程 | 视频2

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

改进YOLOv8 | 即插即用篇 | CVPR2023最新注意力 | 《BiFormer:视觉变换器与双层路由注意力》

作为视觉变换器的核心构建模块,注意力是一种强大的工具,可以捕捉长程依赖关系。然而,这种强大的功能付出了代价:计算负担和内存占用巨大,因为需要在所有空间位置上计算成对的令牌交互。一系列的研究尝试通过引入手工制作和与内容无关的稀疏性来缓解这个问题,例如将注意力…

【技术分享】防止根据IP查域名,防止源站IP泄露

有的人设置了禁止 IP 访问网站&#xff0c;但是别人用 https://ip 的形式&#xff0c;会跳到你服务器所绑定的一个域名网站上 直接通过 https://IP, 访问网站&#xff0c;会出现“您的连接不是私密连接”&#xff0c;然后点高级&#xff0c;会出现“继续前往 IP”&#xff0c;…

81. read readline readlines 读取文件的三种方法

81. read readline readlines 读取文件的三种方法 文章目录 81. read readline readlines 读取文件的三种方法1. 读取文件的三种方法2. read方法3. readline方法4. readlines方法5. 代码总结5.1 read方法读取全部内容5.2 readline方法读取一行&#xff0c;返回字符串5.3 readli…

stable diffusion的使用

文章目录 1 文生图1.1 mountains and trees and gree1.2 three dogs1.3 cats1.4 three lovely cats1.5 beautiful girl1.6 机器猫1.7 卡通图像生成 1 文生图 1.1 mountains and trees and gree 1.2 three dogs 1.3 cats 1.4 three lovely cats 1.5 beautiful girl stable diff…