C++对象模型(6)-- 数据语义学:继承的对象布局(含虚函数)

C++对象模型之简述C++对象的内存布局 在C++中,有两种类的成员变量:static和非static,有三种成员函数:static、非static和virtual。那么,它们如何影响C++的对象在内存中的分布呢? 当存在继承的情况下,其内存分布又是如何呢? 下面就一个非常简单的类,通过逐渐向其中加入各种成员,来逐一分析上述两种成员变量及三种成员函数对类的对象的内存分布的影响。 注:以下的代码的测试结果均是基于Ubuntu 14.0 阅读详情

1、单个类带虚函数的对象布局

当类含有虚函数时,在实例化对象时会产生一个虚函数表指针,这个虚函数表指针通常在对象的开头位置。

class Base {
public:
    int x;
    int y;

    virtual void virFunc() { }
};

对象布局如下:

2、单一继承父类带虚函数的对象布局

(1) 父类带虚函数,子类不带虚函数

class Base {
public:
    virtual void bvirFunc(){ }
protected:
    int b_i;

};

class Derive : public Base{
private:
    int d_i;
    int d_j;
};

类Derive对象的布局如下:

(2) 如果子类也带虚函数

class Base {
public:
    virtual void bvirFunc(){ }
protected:
    int b_i;

};

class Derive : public Base{
public:
    virtual void virFunc(){ }
private:
    int d_i;
    int d_j;
};

发现这时类Derive的对象布局跟不带虚函数时一样。在这种情况下子类会继承父类的虚函数表指针,但子类和父类各自都会有自己的虚函数表。

3、单一继续父类不带虚函数

class Base {
protected:
    int b_i;

};

class Derived : public Base{
public:
    virtual void virFunc(){ }
private:
    int d_i;
    int d_j;
};

这时虚函数表指针还是在类Derive对象开头的位置。

STM32F401RCT6最小系统原理图设计 STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书 阅读详情

相关推荐

嵌入式C开发必备:用Cursor规则搞定代码风格检查(附Pikachu项目实战)

本文以Pikachu开源项目为例,详细介绍了如何利用Cursor的AI代理规则系统,为嵌入式C开发项目配置一套完整的代码风格检查与规范执行方案。通过实战演示,指导开发者创建项目级规则,实现命名、格式、硬件抽象层及驱动开发的自动化规范,从而提升代码一致性、可维护性和团队协作效率。

weixin_29181861的博客 600

深度探索C++对象模型之美

从概念来上来讲,每一个没有定义构造函数的类都会由编译器来合成一个默认构造函数,以使得可以定义一个该类的对象,但是默认构造函数是否真的会被合成,将视是否有需要而定。C++ standard 将合成的默认构造函数分为 trivial(不重要) 和 notrivial(重要) 两种,前文所述的四种情况对应于notrivial默认构造函数,其它情况都属于trivial。对于一个trivial默认构造函数,编译器的态度是,既然它全无用处,干脆就不合成它。

谢谢大家的关注 3494

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1456

C++对象内存模型布局详解

C++封装带来的布局成本多大?由空类组成的继承层次中,每个类对象的大小是多大?在C++中有两种数据成员(class data members):static 和 nonstatic,以及三种类成员函数(class member function):static、nonstatic 和 virtual。

songbijian的博客 1659

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

伺服驱动器485通信

485通信使用方法,485通信在上位机和伺服驱动器之间的应用,根据需要驱动电机旋转。

haipi511715316的博客 1万+

《深度探索C++对象模型》阅读笔记(完整版)

《深度探索C++对象模型》完整阅读笔记

2401_82413779的博客 1904

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1082

深度探索C++对象模型

c++对象模型语言中直接支持面向对象程序设计的部分对于各种支持的底层实现机制说白了是介绍编译器是如何支持、实现C++的面向对象机制的。如,继承、虚函数、指向class members的指针等等,编译器是如何实现的。本书C++语法基于C++95本书出版自2001年,虽然书中用到的标准早已盖棺定论,cfront编译器也早已过时,当时来看一些无法确定的标准、难以实现的技术、功能也早已实现,但是对C++对象模型的某些实现方式依然沿用至今。这本书依然不过时。

surfaceyan的博客 1825

《QGIS快速入门与应用基础》191:渐变区间设置(等间隔/分位数)

深入解析QGIS中渐变符号化的核心环节——渐变区间设置,重点对比等间隔与分位数两种主流模式的原理与应用。作者指出,90%的渐变效果问题源于区间设置不当,强调必须先分析数据分布特征(通过统计面板查看直方图、极值等)再选择匹配模式。等间隔模式适用于均匀分布数据(如海拔、温度),将数值范围均等划分;分位数模式则针对偏态数据(如GDP、人口),保证每个区间要素数量相等。文章通过界面示意图、效果对比图和操作步骤详解,指导读者根据数据类型选择合适区间模式,并提醒常见避坑要点:社会经济数据禁用等间隔、分类数不超过8类。

LuckyHanMo的博客 318

33、AI赋能5G/6G通信:LDPC码解码与强化学习技术解析

本文探讨了基于AI和强化学习的LDPC码技术在5G/6G通信中的应用。包括LAMS解码器、神经MS解码器、盲识别方法、统一极性-LDPC解码器、NNMS和SNNMS解码器、N-2D-NMS解码器、神经分层MS解码器、MAB-NS方案以及强化学习与MCTS结合的技术。这些技术在提升解码性能、降低计算复杂度和增强系统适应性方面表现出色,为未来通信系统的发展提供了强有力的支持。

lambda的博客 243

C++对象模型(整理)

C++对象模型 1、何为C++对象模型? C++对象模型可以概括为以下2部分: ① 语言中直接支持面向对象程序设计的部分 面向对象程序设计部分:如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等。 ② 对于各种支持的底层实现机制 在C++类中有两种数据成员、三种成员函数: 两种数据成员:static、nonstatic。 三种成员函数:static、nonstatic、virtual。 代码举例说明: //base.h #pragma once #include<i

Aced96的博客 3928

【乐企-工具篇】有关乐企发票文件生成- OFD和PDF文件生成

有关乐企发票文件生成-OFD和PDF文件生成

九七的博客 2054

C++对象模型_第四章_C++数据语义学

下面的方式打印成员变量指针。// 16printf("pmyobj->m_n偏移值 = %d\n", mypoint);由于类内存模型会遵循字节对齐,以4字节对齐为例,如果一个变量不满足4字节,编译器会对这个内存进行填充到4字节。下面代码,将小内存的变量char 如果连续定义完后,再定义int,总内存8字节;如果int在char中间定义,总内存12字节。int m_i1;char m_c2;char m_c3;

weixin_43916755的博客 977

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

图说C++对象模型:对象内存布局详解

0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。 本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。 文章如果有解释不清、解释不通或疏漏的地方,恳请指出。 1.何为C++对象模型? 引用《深度探索C++对象模型》这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程...

weixin_34272308的博客 1456

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++多态虚函数实现原理,对象和虚函数表的内存布局

基本概念 我们知道C++动态多态是用虚函数实现的,而虚函数的实现方式虽说C++标准没有要求,但是基本都是用虚函数表实现的(编译器决定)。所以我们有必要了解一下虚函数表的实现原理。 用virtual关键字声明的成员函数是虚函数。 具有虚函数的类及其派生的类会在编译时创建虚函数表,简称虚表(vtbl),虚表是虚函数指针的数组。 具有虚函数的类对象有一个虚表指针(vfptr),是编译器生成的指针,在对象构造时初始化。虚表指针vfptr指向虚表的第一个虚函数指针(即vfptr的值是虚表第一个...

回头太难 3707

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C++多继承虚函数表布局深度解析】:揭秘对象模型背后的内存秘密

深入解析C++虚函数表的多继承布局,揭示对象模型内存分布机制。涵盖多重继承下虚表指针排列、共享与调整规则,适用于复杂类设计与性能优化场景。理解底层原理,提升程序效率,值得收藏。

VarChat的博客 879

《C++新经典对象模型》之第4章 数据语义学

4.1.2 成员函数参数类型的确定时机(最近碰到原则) 04.01.cpp 4.2 进程内存空间布局 最高内存地址 栈区(向下增长) 堆区(向上增长) 数据段(含BSS段) 代码段 最低内存地址进程虚拟地址空间(内存)划分: (1)栈(堆栈/栈区):局部变量等。 (2)堆(堆区):new、malloc等申请内存空间。 (3)BSS段:未初始化全局变量,初始化为0的全局变量。 (4)数据段:已初始化的全局变量,包含BSS段。 (5)代码段:存放程序执行代码。Linux上列出可执行文件中全局变量等存放位置的

yxqq378287007的博客 920

【C++高级对象模型实战】:多继承虚函数表布局的5种典型场景分析

深入解析C++虚函数表的多继承布局,揭示对象模型底层机制。涵盖多重继承、虚基类、菱形继承等5种典型场景,剖析vptr指针分布与内存布局优化策略。助你掌握高效设计与调试技巧,提升程序性能,值得收藏。

ProceShoal的博客 957

《深入探索C++对象模型》之一

前言:        由于经常使用C++,但是又对C++内部机制不是很深入了解,所以看了一些关于C++的经典书籍,其中有《C++ Primer》、《STL源码剖析》、《Efficitive C++》、《More Efficitive C++》。《C++ Primer》特别适合刚使用C++的程序员学习,里面详细介绍了一些C++基础知识,包括流和STL容器、适配器、算法还有C++的面向对象的一些知识。...

杨林峰的笔记 8912

深度解读《深度探索C++对象模型》之C++对象的内存布局(二)

C++语言相比C语言最重要的功能就是支持面向对象编程,为了实现面向对象编程,C++增加了类的封装和多态、继承等特性,那么这些特性的加入是否会造成对象的内存成本增加?如果增加了,那么到底增加了多少?

iShare_Carlos的博客 1489

c++ 对象模型

title: object-mode-layout date: 2022/09/12 tags: c++对象模型 categories: c++对象模型

勤天下而拥家 1357

c++内存对象模型&虚函数表vtable布局研究

vtable c++ 内存布局 查看内存布局 虚函数表 多重继承

a0408152的博客 2079

C++ 新经典:对象模型——目录(先留框架,慢慢来~)

C++ 新经典:对象模型——目录

慢慢记录,慢慢更新。 958

揭秘C++对象模型:虚表与内存布局

而子类新定义的虚函数的地址追加了到了第一个父类子对象中的vfptr指向的虚函数表的末尾。并且如果子类重写了父类的某虚函数,那么会将原本虚函数表中的该虚函数的地址覆盖成子类重写的虚函数的地址,不再是父类的该虚函数的地址,当然如果没有重写,那就还是父类的。首先可以看到,在Left对象中,有一块区域被称为Base子对象,所以我来啰嗦一下:实际上,在继承体系中,不管继承了几个类,继承的层次有多深,在子类对象中,属于同一个父类的成员总是集中在一块的,所以我们可以把子类对象中属于父类的一块叫做该子类对象的子对象。

2302_80221042的博客 1461
上一篇: C++对象模型(5)-- 数据语义学:继承的对象布局(不含虚函数)
下一篇: C++对象模型(7)-- 数据语义学:成员变量偏移值、地址
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值