[c++]多态的分析

news2024/11/19 14:53:01

多态详细解读

    • 多态的概念
      • 多态的构成条件
    • 接口继承和实现继承:
  • 多态的原理:
      • 动态绑定和静态绑定
    • 多继承中的虚函数表


多态的概念

-通俗的来说:当不同的对象去完成某同一行为时,会产生不同的状态。

多态的构成条件

  • 必须通过基类的指针或者引用调用虚函数1
  • 虚函数的重写2三同(函数名,参数,返回值)
    EG:在这里插入图片描述

函数重写的两个例外:

  • 协变(基类与派生类虚函数返回值类型不同):
    但是仅仅支持返回各自的对象的指针或者引用
  • 析构函数的重写(基类与派生类析构函数的名字不同):
    虽然析构函数的函数名不同,但是编译器会做特殊的处理,统一处理成destructor(前提是基类的析构函数加了virtual)

接口继承和实现继承:

  • 普通函数的继承叫做实现继承,虽然连函数名和参数等等也全部继承,但是主要是继承实现,且派生类可以直接使用。
  • 虚函数的继承是接口继承,为了实现重写(重写实现操作)

到这里可能有些小伙伴会不太理解接口是什么,这里我们用一个例子来解释:
问:*p->test( )此时打印出来的结果是什么呢?
是不是第一眼就觉得是B->0呢?我们来看看解析:
在这里插入图片描述

多态的原理:

  • 首先我们先要理解函数虚表这个概念,函数虚表里面存放着虚函数的地址。(为了描述方便,下面都称之为虚表)
  • 当满足多态的两个条件之后:如果传给基类的指针的是子类对象的地址,那就会去调用子类的虚表里面重写之后的对应函数,如果传的是基类对象的地址,那么就会去基类自身的虚表里面找对应的函数。

图例:
在这里插入图片描述
这时候有同学就要问了:这个基类的虚表和子类的虚表是同一张吗?虚表到底有几张?

  • 只要有虚函数,那么对于各种类,他们都有各自的虚表。并且如果派生类(既然叫做派生类,说明是继承了某个类作为基类)中有实现虚函数fun1的重写,那么就会在自身的虚表中覆盖掉从原来基类中的继承下来的fun1的实现(虚函数是接口继承,原函数的实现被覆盖),正因如此才能实现多态。

  • 所以基类和子类的虚表不是同一张,每个类都有自己的虚表

动态绑定和静态绑定

  • 静态绑定就是在程序编译期间,就明确了程序的行为。比如函数的重载
  • 动态绑定也叫做后期绑定,就是在程序运行期间,根据传过来的类型去*确定具体的行为*,比如上述的不同的身份去购买车票会。
  • 细节点:虚表是在编译的时候就生成了,但是对象中只存储指向虚表的指针(由于虚表实际叫做函数指针数组,那么虚表的指针就叫做函数指针数组的指针,这个指针是在对象执行构造函数的时候生成的。)

多继承中的虚函数表

这里主要清楚:对于多继承的派生类,其本身未重写的虚函数放在其第一个继承的父类部分的虚表中。(但是这里要意识到大的来看此处仍然是在派生类的虚表,是派生类虚表中所继承的父类的虚表部分。)
在这里插入图片描述


  1. 虚函数:被virtual修饰的成员函数就称为虚函数 ↩︎

  2. 虚函数的重写:虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。 ↩︎

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

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

相关文章

KMeans,KNN,Mean-shift算法的学习

1.KMeans算法是什么? 在没有标准标签的情况下,以空间的k个节点为中心进行聚类,对最靠近他们的对象进行归类。 2.KMeans公式: 2. 1.关键分为三个部分: 1.一开始会定义n个中心点,然后计算各数据点与中心点…

重装前端整体流程

用户管理 --汇总 -- 明细-CSDN博客 一、node 这个看环境变量 2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了_nodejs安装及环境配置-CSDN博客 配置到国内镜像的时候,去看,淘…

05.线程

进程有哪些缺陷? 1.创建的代价较高 进程是OS进行资源分配的基本单位,也就是说创建进程是需要分配资源的,所以创建代价很高 2.通信不方便 进程之间要想进行通信必须借助第三方资源(管道、内存映射、消息队列) 线程的优…

在线教程|二次元的福音!一键部署APISR,动漫画质飞跃升级

从守护城市安全的「火眼金睛」,到探索人体奥秘的医学之窗,再到娱乐产业的视觉盛宴,乃至遥望宇宙的卫星视角,超分辨率技术重塑着我们观察世界的新维度,让每一寸画面绽放前所未有的清晰与真实。 近年来,越来…

【C++】C++中的template模板

一、泛型编程 关于模板的出现其实是在广大程序员编程中偷懒省下来的。我举个例子你们就知道了。 下述例子是用来实现swap函数的,利用的方式是最基础的重载。 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(d…

【Linux操作系统】:文件操作

目录 前言 一、C语言中文件IO操作 1.文件的打开方式 2.fopen:打开文件 3.fread:读文件 4.fwrite:写文件 二、系统文件I/O 1.系统调用open、read、write 2.文件描述符fd 3.文件描述符的分配规则 4.重定向 5.缓冲区 6.理解文件系统 磁盘 磁盘…

掌握这几点,稳稳拿下中质协六西格玛考试!

在当今竞争激烈的市场环境中,拥有六西格玛证书无疑是提升自身职业竞争力的一大利器。中质协作为权威机构,其六西格玛考试更是备受关注。那么,如何才能稳稳拿下这场考试呢?深圳天行健六西格玛管理培训公司有建议如下: 一…

【计算机毕业设计】springboot国风彩妆网站

二十一世纪我们的社会进入了信息时代, 信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期,几分钟用影刀写了一个爬取应用,每10分钟进行一次排名爬取(以fan‘风扇’为例),0代码爬取。 打开’fan’关键词搜索网页;等待网页加载;滚动进一步加载…

计算机服务器中了devicdata勒索病毒如何解密,devicdata勒索病毒解密恢复工具

在网络技术飞速发展的时代,有效地利用网络开展各项工作业务,能够大大提升企业的生产运行效率,改善企业的发展运营模式,但如果网络利用不好就会给企业的数据安全带来严重威胁。近日,云天数据恢复中心接到很多企业的求助…

复制粘贴插件——clipboard.js的使用

clipboard.js是一款使用简单的粘贴复制插件,它不依赖于Flash或其他框架,在github拥有3万多颗星可见其优秀程度,介绍如何使用它,以备存。 中文文档: clipboard.js 中文文档 - itxst.com 官网网站:https://github.com/…

【C++】 类的6个默认成员函数

目录 1. 类的6个默认成员函数 一.构造函数 1.基本概念 2 特性 注意:C11 中针对内置类型成员不初始化的缺陷,又打了补丁, 3.构造函数详解 3.1构造函数体赋值 3.2 初始化列表 3.3 explicit关键字 二.析构函数 1 概念 2 特性 两个栈实…

安装vmware station记录

想学一下linux,花了3个多小时,才配置好了,记录一下 安装vm12,已配置linux系统 报错,VMware Workstation 与 Device/Credential Guard 不兼容解决方案,网上说有不成功的,电脑蓝屏,选择装vm16试试 vm16 在…

多个.C文件被编译为一个可执行文件的详细过程

多个.C文件被编译为一个可执行文件的详细过程 文章目录 多个.C文件被编译为一个可执行文件的详细过程前言一、一个.C文件的编译过程二、多个.C文件的链接过程1.文件信息2.链接过程3.makefile 总结 前言 C语言经典的 “hello world ” 程序从编写、编译到运行,看到屏…

electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法

系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现过程二、代码演示1.resources/env.json2.App.vue3.main/index.js4.request.js5.安装后修改 前言 使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包,对于多环境…

揭秘Ping32如何实现上网行为监控

企业上网行为管理软件在现代企业管理中扮演着举足轻重的角色。它不仅能够监控和记录员工的上网行为,还能有效防止数据泄露和不当使用,从而保障企业的信息安全。 一、Ping32上网监控软件的具体功能包括: 1.网页浏览监控:对Chrome…

[C++核心编程-06]----C++类和对象之对象模型和this指针

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码,请用go语言。 文心一言: 首先,让我们明确一点:由于您没有提供具体的图18-8(f)的内容,我只能假设它是一个数据结构(可能是图、树或列表等&…

【spring】Security 密码加密算法

Spring Security 提供了多种密码加密算法,用于在存储用户密码时进行加密,以增强安全性。 查看org.springframework.security.crypto.factory.PasswordEncoderFactories 以下是一些常用的密码加密算法: BCryptPasswordEncoder: 这…

白酒:酒精度数与白酒品质消费的关联性研究

酒精度数作为白酒的一项重要指标,不仅影响着白酒的口感和风格,更在很大程度上与白酒的消费存在密切关联。在探讨云仓酒庄豪迈白酒时,我们不能忽视酒精度数与品质消费之间的关联性。 首先,酒精度数的高低直接影响到白酒中酒精的含量…