大话C++之:对象内存模型

  1. 一般继承(无虚函数覆盖)

    1. 只有一个虚指针,指向一个虚表,虚函数按顺序从祖先节点开始插入到虚表上。
    2. 字段按顺序从祖先节点开始插入到对象内存上
    3. 在这里插入图片描述
    4. 在这里插入图片描述
  2. 一般继承(有虚函数覆盖)

    1. 只有一个虚指针,指向一个虚表,虚函数按顺序从祖先节点开始,先查找是否有可以覆盖的,如果有,覆盖掉,否则插到最后。
    2. 字段按顺序从祖先节点开始插入到对象内存上
    3. 在这里插入图片描述
    4. 在这里插入图片描述
  3. 多重继承(有虚函数)

    1. 根据继承的类的数量来一一创建各自内存块,如继承了A,B,C三个类,则先后创建ABC三块,每一个均有自己的虚指针及字段,子类的虚函数分别遍历三个虚指针指向的虚表查找是否产生覆盖,如果有,则覆盖,如果没有则插入到在第一个父类的虚表里
    2. 每个类的字段按顺序跟在各个类内存块的虚指针后面。
    3. 在这里插入图片描述
    4. 在这里插入图片描述
  4. 重复继承(钻石模型)

    1. 此类型与多重继承类似,先把最底层的子类所继承的若干个间接父类(如B1, B2)当作一个整体,把它们先按单一继承创建,再根据多重继承的性质创建。

    2. 在这里插入图片描述

    3. 在这里插入图片描述

  5. 钻石型多重虚拟继承

    1. 	class B {……};class B1 : virtual public B{……};class B2 : virtual public B{……};class D : public B1, public B2{ …… };
      
    2. 虚拟继承的就是为了解决重复继承中多个间接父类的问题。大体思想是:先从间接父类开始创建,把顶层的超类放在内存模型的最后,同时间接父类的虚表只能含有本身的虚函数(同时不能包含顶层超类的虚函数)和子类的虚函数。
    3. 间接父类每一个虚指针后紧一个vbptr虚基类表指针,变量指向一个全类共享的偏移量表,表中项目记录了对于该类而言,“虚基类表指针”与虚基类之间的偏移量。
    4. 内存模型创建过程:
      1. 先创建间接父类B1, 虚继承先创建虚指针,紧跟vbptr,接着是成员变量;遍历B1的虚函数,检查B类中是否有,如果有,则跳过;如果没有,则插入到函数表里。此时B1内存块为:vptr, vbptr, ib1, cb1; 虚函数表有:B1::f1, B1::Bf1;
      2. 重复上面步骤继续创建B2,此时内存块为:vptr, vbptr, ib1, cb1, vptr, vbptr, ib2, cb2; B2虚函数表有:B2::f2, B2::Bf2;
      3. 创建完间接父类,继而创建子类。把子类的字段按顺序紧放在内存后面,子类的函数在间接父类中接按顺序查找是否产生覆盖(同时不能包含顶层超类的虚函数),如果有,则覆盖,继续下一个函数。例如先遍历D::f,由于顶层超类包含了,跳过不处理;对于D::f1,在B1的虚函数表里找到了,则覆盖,此时B1的虚函数表为:D::f1, B1::Bf1。对于D::f2,覆盖了B2的B::f2,B2虚函数表有:D::f2, B2::Bf2; 对于D::Df,没有找到覆盖的,则插到第一个间接父类的虚函数表里。此时B1的虚函数表为:D::f1, B1::Bf1,D::Df。
      4. 最后创建顶层超类。按常规创建B类,创建完之后,用D类的虚函数遍历检查是否产生覆盖,如果有,则覆盖,否则跳过。
    5. 在这里插入图片描述
    6. 在这里插入图片描述

    参考内容:
    钻石型继承模型的内存分布
    C++ 对象的内存布局

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

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

相关文章

桂院校园导航 静态项目 二次开发教程 2.0

Gitee代码仓库:桂院校园导航小程序 GitHub代码仓库:GLU-Campus-Guide 静态项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页,界面更加高效和美观 2 校园页 新增了 “校园指南” 功能,可以搜索和浏览校园生活指南…

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用? JVM(Java虚拟机)是Java程序运行的核心组件,它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成: 类加载器(Class Loader&#…

Modbus协议详细解析与案例分享

目录 Modbus协议详细解析与案例分享1. Modbus协议简介2. Modbus RTU和Modbus TCP的区别3. Modbus帧结构4. Modbus协议示例5. Modbus应用场景结语 Modbus协议详细解析与案例分享 1. Modbus协议简介 Modbus是一种串行通信协议,用于实现工业自动化设备之间的通信。它…

消息中间件|初识消息队列

文章目录 消息队列是什么?消息队列关键概念消息队列优点消息队列的应用场景异步处理应用解耦流量削峰消息通讯 常用消息队列中间件的对比 消息队列是什么? 消息队列(Message Queue)是一种用于在软件系统之间传递消息的通信机制。…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发…

实时抓取SKU商品属性详细信息API数据接口(淘宝,某音)

item_sku-获取sku详细信息 taobao.item_sku详细信息 API公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_sku 名称类型必须描述keyString是调用key(演示示例)secretString是调用密钥api_nameString是API接口名称(包括在请求地…

设计模式学习笔记 - 设计原则 - 3.里氏替换原则,它和多态的区别是什么?

前言 今天来学习 SOLID 中的 L:里氏替换原则。它的英文翻译是 Liskov Substitution Principle,缩写为 LSP。 英文原话是: Functions that use points of references of base classes must be able to use objects of derived classes withou…

python-分享篇-生成仿微信公众号推广的个性二维码(支持动态)

代码 生成仿微信公众号推广的个性二维码(支持动态)from MyQR import myqr # 要生成动态二维码,只需要将piture参数和save_name参数设置gif动图即可 myqr.run(wordshttps://blog.csdn.net/stqer/article/details/135553200, # 指定二维码包含…

JVM(内存区域划分)

JVM JVM - Java虚拟机 我们编写的 Java 程序, 是不能够被 OS 直接识别的 JVM 充当翻译官的角色, 负责把我们写的的 Java 程序 ,翻译给 OS “听”, 让 OS 能够识别我们所写的 Java 代码 JVM 内存区域划分 JVM 是一个应用程序, 在启动的时候, 会从 操作系统 申请到一整块很大的内…

AI-RAN联盟在MWC24上正式启动

AI-RAN联盟在MWC24上正式启动。它的logo是这个样的: 2月26日,AI-RAN联盟(AI-RAN Alliance)在2024年世界移动通信大会(MWC 2024)上成立。创始成员包括亚马逊云科技、Arm、DeepSig、爱立信、微软、诺基亚、美…

【dc-dc】AP510X单路低压差线性恒流芯片

说明 AP510X 是一系列外围电路简洁的单路线性 LED 恒 流芯片,适用于 3-60V 电压范围的 LED 恒流调光 领域。 AP510X 采用我司专利算法,可以实现高精度的恒 流效果,输出电流恒流精度≤ 3 %,电源供电工作 范…

【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目: Problem 1: 栈的应用 155. 最小栈 | LeetCode20. 有效的括号 | LeetCode150. 逆波兰表达式求值 | LeetCode Problem 2: 单调栈 496. 下一个更大元素 I739. 每日温度503. 下一个更大元素 II 目录 Problem 1:栈 - “先进后出”的应用LC 155. 最…

【Java设计模式】五、建造者模式

文章目录 1、建造者模式2、案例:共享单车的创建3、其他用途 1、建造者模式 某个对象的构建复杂将复杂的对象的创建 和 属性赋值所分离,使得同样的构建过程可以创建不同的表示建造的过程和细节调用者不需要知道,只需要通过构建者去进行操作 …

力扣刷题记录--463. 岛屿的周长

题目链接&#xff1a;463. 岛屿的周长 - 力扣&#xff08;LeetCode&#xff09; 题目描述 我的代码实现 class Solution {public int islandPerimeter(int[][] grid) { int result0; int rowgrid.length; int colgrid[0].length; for(int i0;i<row;i){for(int j0;j<col…

【EI会议征稿通知】2024年图像处理与人工智能国际学术会议(ICIPAI2024)

2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09; 2024 International Conference on Image Processing and Artificial Intelligence&#xff08;ICIPAI2024&#xff09; 2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09;将…

返回静态数据

在Java项目中&#xff0c;往往不会一直返回某某数据&#xff0c;而是会返回一个静态页面&#xff0c;那么&#xff0c;如何正确返回一个静态页面呢&#xff1f;&#xff1f; 要想成功的返回一个静态页面前提是必须要有一个静态页面&#xff1a; <!DOCTYPE html> <ht…

如何让 JOIN 跑得更快?

JOIN 一直是数据库性能优化的老大难问题&#xff0c;本来挺快的查询&#xff0c;一旦涉及了几个 JOIN&#xff0c;性能就会陡降。而且&#xff0c;参与 JOIN 的表越大越多&#xff0c;性能就越难提上来。 其实&#xff0c;让 JOIN 跑得快的关键是要对 JOIN 分类&#xff0c;分…

Effective Programming 学习笔记

1 基本语句 1.1 断言 在南溪看来&#xff0c;断言可以用来有效地确定编程中当前代码运行的前置条件&#xff0c;尤其是以下情况&#xff1a; 第三方工具库对输入数据的依赖&#xff0c;例如&#xff1a;minitouch库对Android版本的要求

第三百八十一回

文章目录 1. 概念介绍2. 修改方法 015buttonStyle.png2.1 修改形状2.2 修改颜色2.3 修改位置 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何创建以图片为背景的页面"相关的内容&#xff0c;本章回中将介绍如何修改按钮的形状.闲话休提&#xff0c;让我们一起T…

2024年华为OD机试真题-文件缓存系统-Python-OD统一考试(C卷)

题目描述: 请设计一个文件缓存系统,该文件缓存系统可以指定缓存的最大值(单位为字节)。 文件缓存系统有两种操作:存储文件(put)和读取文件(get) 操作命令为put fileName fileSize或者get fileName 存储文件是把文件放入文件缓存系统中;读取文件是从文件缓存系统中访问已存…