[c++]多态的分析

多态详细解读

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


多态的概念

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

多态的构成条件

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

函数重写的两个例外:

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

接口继承和实现继承:

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

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

多态的原理:

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

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

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

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

动态绑定和静态绑定

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

多继承中的虚函数表

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


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

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

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

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

相关文章

超级简单的地图操作工具开发可疑应急,地图画点,画线,画区域,获取地图经纬度等

使用echars的地图画点,画线,画区域,获取地图经纬度等 解压密码:10086007 地图也是用临时的bmap.js和china.js纯离线二选一 一共就这么多文件 画点,画线,画区域 点击地图获取经纬度-打印到控制台,这样就能渲染航迹,多变形,结合其他算法算圆等等操作 下载资源:https://download…

Databend 开源周报第 144 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 了解 Databend …

Redis-详解(基础)

文章目录 什么是Redis?用Redis的特点?用Redis可以实现哪些功能?Redis的常用数据类型有哪些?Redis的常用框架有哪些?本篇小结 更多相关内容可查看 什么是Redis? Redis(Remote DictionaryServer)是一个开源…

【AI学习】对指令微调(instruction tuning)的理解

前面对微调(Fine-tuning)的学习中,提到指令微调。当时,不清楚何为指令微调,也一直没来得及仔细学习。 什么是指令微调?LLM经过预训练后,通过指令微调提升模型的指令遵循能力。所谓指令&#xf…

uniapp怎么使用jsx

安装vitejs/plugin-vue-jsx npm install vitejs/plugin-vue-jsx -Dvite.config.js配置 import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni"; import vueJsx from vitejs/plugin-vue-jsxexport default defineConfig({plu…

全方位入门git-慕课网 笔记

目录 【上传github忽略某些文件】【配置用户名和邮箱】【想要删除不需要的文件时如何进行操作】【想要给文件重命名如何操作】【想要移动文件到其他位置时如何操作】【文件有变化时,如何查看前后变化】【操作失误的情况下如何实现一键还原】【不再追踪时如何实现撤销…

区块链 | NFT 水印:Review on Watermarking Techniques(一)

🍍原文:Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 1 应用于 NFT 的水印技术 常见的水印技术类型可以分为: 可见 v i s i b l e \mathsf{visible} visi…

项目9-网页聊天室1(注册+Bycrpt加密)

1.准备工作 1.1.前端页面展示 1.2 数据库的建立 我们通过注册页面,考虑如何设计用户表数据库。 用户id,userId用户名,唯一,username用户密码,password(包括密码和确认密码ensurePssword【数据库没有该字段…

【全开源】酷柚易汛ERP 源码部署/售后更新/上线维护

一款基于FastAdminThinkPHPLayui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装鞋帽、化妆品、机械机电…

openssl 生成证书步骤

本地测试RSA非对称加密功能时,需要用到签名证书。本文记录作者使用openssl本地生成证书的步骤,并没有深入研究openssl,难免会有错误,欢迎指出!!! 生成证书标准流程: 1、生成私钥&am…

jar包安装成Windows服务

一、前言 很多年前写过一篇《使用java service wrapper把windows flume做成服务》的文章,也是把jar包安装成windows服务,今天介绍另外一种更简便的方案。 二、正片 这次使用的工具是 winsw,一个Windows服务包装器。下面看详细介绍 首先从g…

运输层(计算机网络谢希仁第八版)——学习笔记五

课件:课程包列表 (51zhy.cn) 目录 运输层协议概述 用户报协议UDP 传输控制协议TCP概述 可靠传输的工作原理 TCP可靠传输的实现 TCP的流量控制 TCP的拥塞控制 TCP的运输连接管理 运输层协议概述 进程之间的通信 运输层的位置——只有位于网络边缘部分的主机的协议栈才…

Vue3实战笔记(13)—pinia安装笔记

文章目录 前言安装和配置pinia总结 前言 Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 Pinia是一个轻量级的状态管理库,它专注于提供一个简单的API来管理应用程序的状态。相比之下,Vuex是一个更完整的状态管理库&#xf…

【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手

文章目录 一、前言二、绘制效果三、ConstraintLayout 使用方法3.1 创建布局文件3.2 替换配置3.3 设置约束,步骤13.4 设置约束,步骤23.5 其他设置 四、结束 一、前言 在进行Android APP开发过程中,减少layout嵌套即可改善UI的绘制性能&#x…

在阿里云服务器上安装MySQL

目录 一、先卸载不需要的环境 1.关闭MySQL服务 2.查看安装包以及卸载安装包 3.依次卸载所有包 4. 获取mysql官⽅yum源 二、安装(密钥过期解决方法) 三、启动并进入 关于MySQL MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS&…

嵌入式学习-通用定时器

简介 框图介绍 时钟选择 计数器部分 输入捕获和输出比较框图 嵌入式学习全文参考(小向是个der)做笔记:https://blog.csdn.net/qq_41954556/article/details/129735708

单区域OSPF实验

实验目的: 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置: 搭建实验拓扑图; 配置路由器接口的IP地址以及配置环回地址待后续使用 (1&a…

Patch-Wise Graph Contrastive Learning for Image Translation

Patch-Wise Graph Contrastive Learning for Image Translation 图像翻译中的逐块图对比学习 Chanyong Jung1, Gihyun Kwon1, Jong Chul Ye1, 2 Chanyong Jung,Gihyun Kwon,Jong Chul Ye 1, 2 Abstract 摘要 Patch-Wise Graph Cont…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏,先jadx分析一波 没有什么关键信息,但找到了一个unity类,想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息,看wp: Asse…

(docker)进入容器后如何使用本机gpu

首次创建容器,不能直接使用本机gpu 在系统终端进行如下配置: 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation,安装NVIDIA Container Toolkit …