侯捷 C++ part2 兼谈对象模型笔记——6 多态 虚机制

news2024/11/27 22:44:40

6 多态 虚机制

6.1 虚机制

当类中有虚函数时(无论多少个),其就会多一个指针—— vptr 虚指针,其会指向一个 vtbl 虚函数表,而 vtbl 中有指针一一对应指向所有的虚函数

有三个类依次继承,其中A有两个虚函数 vfunc1() vfunc2(),B改写了A的 vfunc1(),C又改写了B的 vfunc1(),子类在继承中对于虚函数会通过指针的方式进行——因为可能其会被改写

继承中,子类要继承父类所有的数据和其函数调用权,但虚函数可能会被改写,所以调用虚函数是==动态绑定==的,通过指针 p 找到 vptr,找到vtbl,再找到调用的第n个虚函数函数——( *(p->vptr[n]) )(p)

image-20230808095746683

编译器在满足以下三个条件时就会做==动态绑定==:

  1. 通过指针调用
  2. 指针是向上转型 up-cast ——Base* basePtr = new Derived;
  3. 调用的是虚函数

编译器就会编译成 ( *(p->vptr[n]) )(p) 这样来调用

例如:用一个 Shape(父类)的指针,调用 Circle(子类)的 draw 函数(每个形状的 draw 都不一样,继承自 Shape)

多态:同样是 Shape 的指针,在链表中却指向了不同的类型

list<Shape*> Mylist

image-20230808104025485

多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护

6.2 动态绑定

image-20230808111646258

a.vfunc1() 是通过对象来调用,是 static binding 静态绑定

在汇编代码中,是通过 call 函数的固定地址来进行调用的

image-20230808112307107

pa 是指针,是向上转型,是用其调用虚函数—— dynamic binding 动态绑定

在汇编代码中,调用函数的时候,蓝框的操作用 c语言 的形式即是 —— ( *(p->vptr[n]) )(p)

下面同理

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

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

相关文章

​LeetCode解法汇总617. 合并二叉树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你两棵二…

智能制造感知产品在工业4.0中的应用

在工业4.0时代&#xff0c;智能制造已经成为制造行业的重要发展方向。智能制造感知产品作为智能制造的核心组成部分&#xff0c;对于提高制造效率、降低成本、提升产品质量等方面具有重要的作用。本文将详细介绍智能制造感知产品在工业4.0中的应用。 智能制造感知产品在工业4.…

磁场是灵魂散发出来的力量

为什么有些人的思维很敏捷&#xff0c;但是&#xff0c;到了另外一个人面前&#xff0c;他的思维会突然错乱或停顿了呢&#xff1f; 每一个人的磁场都有一种释放和吸收的功能&#xff0c;如果经常和磁场比较污浊的人接触&#xff0c;他也会把我们的磁场给染污了。如果跟一个磁场…

IDEA部署配置Maven项目教程,IDEA配置Tomcat(2019.3.3)(2023.1.3)

我们往往会用到多版本的IDEA进行一个Maven项目配置部署&#xff0c;还有tomcat的配置&#xff0c;这里就有你需要的&#xff0c;有低版本的&#xff0c;也有高版本的&#xff0c;根据自己的情况来进行一个操作 一、前言 当涉及到软件开发和项目管理时&#xff0c;使用一个可靠的…

iPhone恢复备忘录的4种方法!超好用!

iPhone备忘录能够帮助我们记录一些重要的事务或者个人事项&#xff0c;帮助减少遗漏和失误。小编也常常使用iPhone备忘录来记录事情&#xff0c;避免自己忘记。但有时候可能会因为自己的操作失误&#xff0c;导致备忘录误删除或丢失&#xff0c;那么这时候该怎么办呢&#xff1…

电子行业精密空调监控,这个方法非常全面!

在电子行业&#xff0c;精密空调监控扮演着至关重要的角色。电子设备的制造、储存和运行过程中&#xff0c;恒定的环境条件如温度、湿度和空气质量对于确保设备的高效运行和稳定性至关重要。 由于许多电子元件对环境变化极为敏感&#xff0c;因此精密空调监控成为了维护产品质量…

使用UDP协议实现—翻译服务器

目录 前言 1.设计思路&#xff1a; 2.词库设计 3.设计客户端 4.设计服务端 5.编译客户端和服务端 6.测试结果 7.总结 前言 上一篇文章中&#xff0c;我们使用UDP协议编码完成了一个简单的服务器&#xff0c;实现数据通信&#xff0c;服务器设计出来后目的不仅仅只是实现…

C#软件外包开发框架

C# 是一种由微软开发的多范式编程语言&#xff0c;常用于开发各种类型的应用程序&#xff0c;从桌面应用程序到移动应用程序和Web应用程序。在 C# 开发中&#xff0c;有许多框架和库可供使用&#xff0c;用于简化开发过程、提高效率并实现特定的功能。下面和大家分享一些常见的…

VeraCard已经上线了 — 快来领取你的吧!

VeraCard现在已经可以订购&#xff0c;并为英国居民积极发货&#xff01;VeraCard是一张Visa借记卡&#xff0c;是我们与DAMEX合作推出的。Verasity是在DAMEX上列出的第一个替代币&#xff0c;并且是第一个拥有自己品牌卡片的代币。有了VeraCard&#xff0c;Verasity社区成员现…

OpenCV图像处理——形态学操作

目录 连通性形态学操作腐蚀和膨胀开闭运算礼帽和黑帽 连通性 形态学操作 形态学转换是基于图像形状的一些简单操作。它通常在二进制图像上执行。腐蚀和膨胀时两个基本的形态学运算符。然后它的变体形式如开运算&#xff0c;闭运算&#xff0c;礼帽黑帽等 腐蚀和膨胀 cv.erode…

OSI七层模型和TCP/IP四层模型

OSI七层模型和TCP/IP四层模型 七层模型(OSI) OSI七层模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是一个用于计算机网络体系结构的标准化框架&#xff0c;旨在定义网络通信中不同层次的功能和协议。 各个层次具体如下&#xff1a; 物理层&am…

【Spring专题】Spring之Bean的生命周期源码解析——阶段一(扫描生成BeanDefinition)

目录 前言阅读准备阅读指引阅读建议 课程内容一、生成BeanDefinition1.1 简单回顾*1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 ClassPathBeanDefinitionScanner#scan2.2 ClassPathBeanDefinitionScanner#doScan2.3 ClassPathScanningCandidateComponentProvider#findCandid…

中国电子学会2021年09月C++语言等级考试试卷一级真题及(参考答案)

一, 解析:主要考察变量类型的转换。 #include<iostream> using namespace std;int main() {int a,b;cin>>a>>b;cout<<a*(long long)b;return 0; }二, 解析:输入输出 #include<iostream> using namespace std;int main() {int a;

excel操作之向下填充快速操作(序号1->100)

开始-》填充-》序列-》列 步长值为1&#xff0c;终止值为100 如果是日期操作

企业想实现数字化转型需要搭建什么平台来实现?

实现数字化转型需要企业建立全面、集成的平台&#xff0c;以支持采用现代技术、提高运营效率、改善客户体验并促进数据驱动的决策。虽然具体的平台要求可能会根据行业和公司的需求而有所不同&#xff0c;但一些基本组件对于成功的数字化转型至关重要&#xff1a; 1.云基础设施…

易语言调用大漠插件免注册到系统和注册VIP源码(标准版)

源码名称&#xff1a;易语言调用大漠插件免注册到系统和注册VIP源码有完整的备注说明.有两个源码,一个是将dm.dll注册到系统调用方法一个是不将dm.dll注册到系统调用方法以用用注册码来注册大漠插件VIP方法. 源码下载&#xff08;下面三个下载地址&#xff0c;请选择一个网盘下…

SpringBoot复习:(45)@Component定义的bean会被@Bean定义的同名的bean覆盖

有同名的bean需要配置&#xff1a; spring.main.allow-bean-definition-overridingtrue 否则报错。 package cn.edu.tju.component;import org.springframework.stereotype.Component;Component public class Person {private String name;private int age;{this.name "…

docker安装达梦数据库

下载安装包 https://eco.dameng.com/download/ 启动达梦数据库 docker run -d -p 5236:5236 --restartalways --name dm8_01 --privilegedtrue -e PAGE_SIZE16 -e LD_LIBRARY_PATH/opt/dmdbms/bin -e INSTANCE_NAMEdm8_01 -v /data/dm8_01:/opt/dmdbms/data dm8_single:v8.…

SD 关于Va01/2/3 字段 KOMV-KBETR 程度为0的问题

有问题的系统 S4 (va01-项目概览 页签 右上角的 配置-管理员) 之前的ECC P环境 使得需要看到此字段的用户群体一直有问题&#xff0c;影响他们实际作业。 但是没有找到修改该字段的地方。 非常时期用非常手段吧。既然找不到&#xff0c;那就冒个险 改数据 是存在TCVIEW表里面…

Design-Pattern设计模式

Design-Pattern设计模式 图说设计模式 图说设计模式 在线书籍 软件模式是将模式的一般概念应用于软件开发领域&#xff0c;即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式&#xff0c;还包括 架构模式、分析模式和过程模式等&#xff0c;实际上&#xff…