【C++】多态(重写)的实现过程及其原理【核心知识点精讲】(22)

news2024/11/24 15:03:17

前言

大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

目录

  • 一.基础知识介绍
    • 1)虚函数&虚函数表
    • 2)虚函数&虚函数表的存储问题
    • 3)派生类的虚表的生成 -----(覆盖&重写)
    • 4)动静态绑定(多态属于动态绑定)
  • 二.多态的原理
    • 1)多态调用函数时动作
    • 2)多态的动态绑定————函数调用发生时间
    • 3)结合多态条件剖析多态原理
  • 三.区分“虚表”与“虚基表”

一.基础知识介绍

1)虚函数&虚函数表

  • 虚函数:即被 virtual 修饰的类成员函数称为虚函数。
class Person {
public:
 virtual void BuyTicket() { cout << "买票-全价" << endl;}
};
  • 虚函数表本质是一个存虚函数指针 指针数组,一般情况这个数组最后面放了一个nullptr。
  • 虚函数表:虚函数表存的是虚函数指针,不是虚函数,虚函数和普通函数一样的,都是存在代码段的,只是他的指针又存到了虚函数表中。
  • 一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表

2)虚函数&虚函数表的存储问题

  • 虚表存的是虚函数指针,不是虚函数,虚函数和普通函数一样的,都是 存在代码段的 ,只是他的指针又存到了虚表中;且虚表也是 存在代码段的

3)派生类的虚表的生成 -----(覆盖&重写)

  1. 先将基类中的虚表内容 拷贝 一份到派生类虚表中
  2. 如果派生类重写了基类中某个虚函数,用派生类自己的虚函数 覆盖 虚表中基类的虚函数
  3. 派生类自己 新增加 的虚函数,按其在派生类中的声明次序增加到派生类虚表的最后

于是我们最后的出结论:

  • 虚函数的 重写也叫作覆盖 ,覆盖就是指虚表中 虚函数的覆盖
  • 重写是语法的叫法,覆盖是原理层的叫法

4)动静态绑定(多态属于动态绑定)

  1. 静态绑定又称为前期绑定(早绑定):在程序编译期间,确定了程序的行为,也称为静态多态,比如: 函数重载
  2. 动态绑定又称后期绑定(晚绑定):是在程序运行期间 根据具体拿到的类型确定程序的具体行为 ,调用具体的函数,也称为动态多态。

二.多态的原理

1)多态调用函数时动作

  • 调用函数时,指针会到 其相应对象的虚函数表中 找到与原函数对应的虚函数;
  • 这样就实现出了不同对象去完成同一行为时,展现出不同的形态;

2)多态的动态绑定————函数调用发生时间

  • 多态以后的函数调用,不是在编译时确定的,是 运行起来以后 对象 的中取找的。

3)结合多态条件剖析多态原理

我们要达到多态,有两个条件

  1. 虚函数覆盖 ----------调用函数时,指针会到其相应对象的虚函数表中找到与函数对应的虚函数
  2. 对象的指针或引用调用虚函数 ---------多态以后的函数调用是运行起来以后到对象的中取找的

三.区分“虚表”与“虚基表”

  • 虚表是实现存放虚函数指针的数组,用于多态的实现
  • 虚基表是用于解决菱形继承数据冗余问题的表,存放的是偏移量,确保了派生类可以正确访问共同基类的成员

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

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

相关文章

It Is All About Data: A Survey on the Efects of Data on Adversarial Robustness

It Is All About Data: A Survey on the Effects of Data on Adversarial Robustness----《这一切都关乎数据&#xff1a;关于数据对对抗性鲁棒性影响的调查》 摘要 对抗性示例是攻击者故意设计的机器学习模型的输入&#xff0c;目的是迷惑模型&#xff0c;使其犯错误。这些例…

Java对象的深拷贝

什么是深拷贝 在Java中&#xff0c;对象的深拷贝是指创建一个新的对象&#xff0c;并复制原始对象的所有字段和属性&#xff0c;包括嵌套对象。深拷贝确保原始对象和拷贝对象是完全独立的&#xff0c;对其中一个对象的修改不会影响另一个对象。 深拷贝需要注意的点 在Java中…

震裕科技-300953 三季报分析(20231108)

震裕科技-300953 基本情况 公司名称&#xff1a;宁波震裕科技股份有限公司 A股简称&#xff1a;震裕科技 成立日期&#xff1a;1994-10-18 上市日期&#xff1a;2021-03-18 所属行业&#xff1a;专用设备制造业 周期性&#xff1a;0 主营业务&#xff1a;精密级进冲压模具及下游…

【hcie-cloud】【5】华为云Stack规划设计之华为云Stack标准化配置、缩略语【下】

文章目录 前言、华为云Stack交付综述为云Stack标准组网华为云Stack标准化配置华为云Stack配置概览华为云Stack云服务全视图华为云Stack部署方案节点类型说明华为云Stack云服务组件部署场景管理节点部署原则云平台管理规格华为云Stack IaaS场景&高阶场景起步必选部署组件x86…

Python高级语法----Python多线程与多进程

文章目录 多线程多进程注意事项多线程与多进程是提高程序性能的两种常见方法。在深入代码之前,让我们先用一个简单的比喻来理解它们。 想象你在一家餐厅里工作。如果你是一个服务员,同时负责多个桌子的顾客,这就类似于“多线程”——同一个人(程序)同时进行多项任务(线程…

RflySim | 滤波器设计实验二

本讲是关于无人机滤波器&#xff0c;其中包括无人机滤波器简介、测量原理、线性互补滤波器设计、线性互补滤波器参数分析、卡尔曼滤波器设计等。 滤波器设计实验2 卡尔曼滤波器是一种递推线性最小方差估计算法&#xff0c;它的最优估计需满足以下三个条件&#xff1a; 1&#…

【Spring】静态代理

例子&#xff1a; 租房子 角色&#xff1a; 我 &#xff08;I ) 中介( Proxy ) 房东( host ) Rent 接口 package org.example;public interface Rent {void rent(); }房东 package org.example;public class Host implements Rent{Overridepublic void rent() …

NAT协议

目录 NAT 前言 NAT地址转换表 NAT分类 前言 静态NAT 192.168.1.2访问200.1.1.2执行过程 动态NAT 192.168.1.2访问200.1.1.2执行过程 NAPT 192.168.1.2的5000端口访问200.1.1.2的80端口执行过程 基本命令 配置动态NAPT转换 定义内外网接口 配置NAPT 静态NAPT配置…

NetworkManager 图形化配置 bond

1、在桌面右下角找到网络连接标识&#xff0c;鼠标右击&#xff0c;选择编辑连接&#xff0c;如下图 注意&#xff1a;此次示例使用 ens37 和 ens38 两张网卡组成 bond。在配置 bond 前为了网 络稳定如果子网卡已有网络连接的建议先删除 bond 子网卡的网络连接。 2、单击按钮&a…

Python高级语法----Python异步编程入门

文章目录 异步编程概念asyncio模块基础event loop和coroutineasync与await关键字代码示例结论在现代软件开发中,异步编程已经成为一个不可或缺的概念,尤其是在处理I/O密集型任务和高并发需求时。Python作为一门多范式编程语言,自3.5版本以来,通过引入asyncio模块和async/aw…

UseGalaxy.cn生信云平台文本文件操作手册

文本文件是生物信息学中应用非常广泛的文本格式&#xff0c;甚至可以说是最重要的文件格式&#xff0c;比如常见的测序下机数据Fastq、参考基因组保存格式Fasta、比对文件SAM&#xff0c;以及突变列表VCF&#xff0c;它们都是文本文件。熟练地进行文本文件的处理&#xff0c;对…

facebook分享-错误记录

无法拉起分享 "code":30000,"msg":"fail:API_ERROR: API_ERROR" 1.确认facebook的app_id是否一致 2.确认是否在app_id应用的白名单里&#xff0c;注册meta开发者&#xff0c;然后把主页的user_id给管理员加 A ContentProvider for this app was…

响应式生活常识新闻博客资讯网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;30483 模板编码&#xff1a;UTF8 模板分类&#xff1a;博客、文章、资讯、其他 适合行业&#xff1a;博客类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVCSS&a…

Pandas - 数据转换

数据转换一班包括一列数据转换为多列数据&#xff0c;行列转换&#xff0c;DataFrame转换为字典、DataFrame转换为列表和DataFrame转换为元组等。 1.一列数据转换为多列数据 如原始地址数据为&#xff1a;“广东省 深圳市 罗湖区 xxxx”&#xff0c; 此时如果我们需要按照省来…

解密网易数帆DataOps“三剑客”:从数据开发治理、指标中台到ChatBI

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;以“数智聚力&#xff0c;共赴新程”为主题的2023网易数字大会在杭州召开。在这次大会上&#xff0c;数据猿采访了网易副总裁、网易数帆总经理汪源&#xff0c;网易数帆大数据产品线总经理余利华&#xff0c;对…

centos7部署Canal与Canal集成使用

1、简介 canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigge…

项目实战:中央控制器实现(2)-优化Controller,将共性动作抽取到中央控制器

1、FruitController FruitController已经和Web没有关系了&#xff0c;和Web容器解耦&#xff0c;可以脱离Web容器做单元测试 package com.csdn.fruit.controller; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.dto.R…

Linux C基础(7)

1、二维数组 1.1 概念 本质&#xff1a;元素为一堆数组的数组&#xff08;数组的数组&#xff09;数组的特点&#xff1a;&#xff08;1&#xff09;数据类型相同 &#xff08;2&#xff09;地址连续 1.2 定义 数组&#xff1a;存储类型 数据类型 数组名[元素个数]二维数组&…

TinyEngine 开源低代码引擎首次直播答疑QA合集

前言 10月27日晚8点&#xff0c;OpenTiny 社区开启了 TinyEngine 开源低代码引擎首次答疑直播&#xff0c;本次直播我们通过收集开发者诉求&#xff0c;精心策划和组织了内容&#xff0c;希望提供给大家最明确和清晰的答疑方式。这是 TinyEngine 低代码引擎直播计划的开端&…

什么是数字化管理?产业园区如何进行数字化管理?

工业园区的数字化管理涉及利用技术和数据驱动的工具来优化工业园区环境中的运营、提高效率并改进决策流程。它通常包括使用各种数字技术和数据分析技术来监视、控制和增强公园运营的各个方面。 以下是工业园区数字化管理的一些关键方面以及如何实施&#xff1a; 1.数据收集和…