[c++]多态的分析

多态详细解读

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


多态的概念

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

多态的构成条件

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

函数重写的两个例外:

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

接口继承和实现继承:

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

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

多态的原理:

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

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

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

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

动态绑定和静态绑定

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

多继承中的虚函数表

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


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

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

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

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

相关文章

C语言/数据结构——(链表的回文结构)

一.前言 今天在牛客网上刷到了一道链表题——链表的回文结构https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?,巧合的是它的解题思路恰好是我们一起分享过两道链表题的汇总。这两道题分别是反转链表和链表的中间节点。废话不多数&#xff0c…

Redis 源码安装和入门介绍

Linux下的redis源码安装 redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings),…

智能商品计划系统:引领未来零售业的革新之路

随着科技的飞速发展,人工智能(AI)和大数据技术已成为推动各行业革新的关键动力。在零售行业中,智能商品计划系统的出现,正逐步改变着传统的商品规划与管理方式,为品牌注入新的活力与竞争力。本文将对智能商…

Java入门基础学习笔记14——数据类型转换

类型转换: 1、存在某种类型的变量赋值给另一种类型的变量; 2、存在不同类型的数据一起运算。 自动类型转换: 类型范围小的变量,可以直接赋值给类型范围大的变量。 byte类型赋值给int类型,就是自动类型转换。 pack…

Android 屏幕适配全攻略(中)-从九宫格到矢量图,揭秘Android多屏幕适配的正确打开方式

在移动互联网时代,无论是小小的手机屏幕,还是大大的平板显示器,Android 应用都必须做到完美适配,给用户以极佳的体验。本文将剖析 Android 多屏幕适配背后的种种技术细节,为您揭开最佳实践的正确打开方式,让…

速卖通ip地址会相互影响吗?如何防止账号关联?

在跨境电商行业,大部分平台都是不允许一个卖家操作多个店铺的,如果被平台检测出账户关联,可能会被封店。在速卖通平台,会通过IP地址来判断是否经营多个账号吗?IP地址会使店铺相互影响吗? 一、速卖通IP地址会关联吗? 首先各位卖…

解决mybatis的配置文件没代码提示的问题

1.将org.apache.ibatis.builder.xml包里的两个dtd文件复制出来,jar包里复制 2.复制dtd的url地址: http://mybatis.org/dtd/mybatis-3-mapper.dtd 一样的做法! 3.关闭两个配置文件,重新打开,就可以有代码提示了&…

【智能优化算法】白鲨智能优化算法(White Shark Optimizer,WSO)

白鲨智能优化算法(White Shark Optimizer,WSO)是期刊“KNOWLEDGE-BASED SYSTEMS”(中科院一区期刊 IF8.6)的2022年智能优化算法 01.引言 白鲨智能优化算法(White Shark Optimizer,WSO)的核心理念和基础灵感来自大白鲨的行为,包括它们在导航和…

从项目开始学习Vue——02(若依框架)

往期: 从项目开始学习Vue——01 目录标题 一、基础插件(一)路由Vue Router(二)导航守卫(路由拦截器)二、Vuex(一)什么是VuexVuex的部分介绍内容: &#xff08…

QQ超大文件共享(别用,传进去后,压缩都显示不出来,LJ qq!)(共享文件)

文章目录 需要共享双方同时在线开启方法第一次会提示设置默认共享目录&#xff0c;默认是E:\QQFileShare\<qq号>\&#xff1a;然后新建共享会在其后创建共享目录&#xff0c;共享目录中只能共享文件。需要点击添加文件&#xff0c;直接把文件拷贝到目录里好像还不行&…

C语言/数据结构——(相交链表)

一.前言 今天在力扣上刷到了一道题&#xff0c;想着和大家一起分享一下这道题——相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists废话不多说&#xff0c;让我们开始今天的分享吧。 二.正文 1.1题目描述 是不是感觉好长&#xff0c;我也这么觉得。哈…

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…

OAuth 2.0 和 OAuth 2.1

OAuth 2.0 和 OAuth 2.1比较&#xff1a; OAuth 2.0 和 OAuth 2.1 是授权框架的不同版本&#xff0c;它们用于允许应用程序安全地访问用户在另一个服务上的数据。以下是它们之间的一些主要区别&#xff1a; 安全性增强&#xff1a;OAuth 2.1 旨在提高安全性&#xff0c;它整合…

什么是云原生架构,我们该如何做好云原生安全,引领云计算时代的应用程序革新

随着云计算技术的飞速发展&#xff0c;企业面临着前所未有的机遇和挑战。在这个高度竞争的市场中&#xff0c;传统的应用程序架构因其僵化、不易扩展和维护的特点&#xff0c;已难以满足当今企业对灵活性、可伸缩性和高效性的追求。在这样的背景下&#xff0c;云原生架构应运而…

git rebase 合并当前分支的多个commit记录

git rebase 合并当前分支的多个commit记录 git rebase 相关的选项和用法step1&#xff1a;找到想要合并的 commitstep2. 使用 rebase -istep3. 编辑提交历史&#xff1a;step4.编辑合并后的提交信息step5.完成 rebase 过程&#xff1a;step6.**推送更新&#xff1a;**step6.**再…

FFmpeg常用API与示例(三)—— 音视频解码与编码

编解码层 1.解码 (1) 注册所有容器格式和 CODEC:av_register_all() (2) 打开文件:av_open_input_file() (3) 从文件中提取流信息:av_find_stream_info() (4) 穷举所有的流&#xff0c;查找其中种类为 CODEC_TYPE_VIDEO (5) 查找对应的解码器:avcodec_find_decoder() (6) …

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路&#xff0c;利用一个队列&#xff0c;去完成层序遍历&#xff0c;但是这里会有些许的不同&#xff0c;我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

js 数据格式转换,对象转数组,数组转对象

1.对象转数组 // 对象obj转换成数组格式 let obj { orgCode:分局编码, alertId:告警ID, name:告警名称 } let arr [] for(let key in obj) { console.log(11,key,obj[key]); // 定义一个对象&#xff0c;赋值 let o { id: key, // key是obj对象的键值 label: obj[key] …

重装前端整体流程

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

Java方法的重载

方法重载 1. 为什么需要方法重载 public class TestMethod{public static void main (String[] args){int a 10;int b 20;int ret add(a,b);System.out.println("ret "ret);double a2 10.5;double b2 20.5;double ret2 add(a2,b2);System.out.println("…