C++中的虚函数表及对象内存布局

深入C++对象内存布局:从虚函数表到多重继承的底层实现 在C++编程中,理解对象内存布局是掌握面向对象核心机制的关键。从内存对齐、成员变量排列等基础概念出发,编译器通过虚函数表指针实现动态绑定机制,这是多态性的底层原理。这种设计在工程实践中具有重要价值,它使得运行时类型识别和函数动态派发成为可能,广泛应用于框架设计、插件系统等需要灵活扩展的场景。本文聚焦于C++继承体系下的内存结构,特别是虚函数表和多重继承带来的指针调整问题,通过分析内存布局帮助开发者编写更高效、安全的代码,并避免对象切片等常见陷阱。 阅读详情


虚函数的作用是为了实现多态,当类中的某个函数希望在派生类中重写时,这个函数要被声明为virtual。具有虚函数的类对象中均会存有虚函数指针,该指针放在对象内存的头部,且指针指向虚函数表,虚函数表中存放虚函数的入口地址,起初,我也不太明白虚函数表的存放位置,看了篇博客《关于C++中虚函数表存放位置的思考 》,其中说虚函数表存放在可执行文件的只读数据字段,感觉有点太深奥了,搞不明白,有兴趣的朋友可以去看看。虚函数表的组织形式是按照基类->派生类的顺序来排序的,如果派生类中有和基类重名的虚函数,就会发生覆盖,具体的分析见《C++ 虚函数表解析》,同时另外一篇同一作者写的对象在内存中的布局,这个应该是上篇文章的升级版,具体阐述了c++对象在内存中的存放形式《C++ 对象的内存布局》

c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。
1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。
2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。
3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。
因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

C++类对象中虚函数表指针、虚函数表、虚函数之间的关系以及在内存中的布局 ​ 目录 C++类的虚函数表和虚函数在内存中的位置 虚函数表和虚函数在内存中的位置说明 结论 原文https://blog.youkuaiyun.com/JMW1407/article/details/108243316 C++类的虚函数表和虚函数在内存中的位置 关系:虚函数表指针(保存在堆或栈)->虚函数表(常量区.rodata)->虚函数(代码段 .text) 虚函数表指针是虚函数表所在位置的地址。虚函数表指针属于对象实例。因而通过new 出来的对象的虚函数表指针位于堆,声名对象的... 阅读详情

相关推荐

新手自己动手设置3D-slicer中文版(超详细图文)

3DSlicer是一个开源的免费软件,用于医学图像分析(包括配准和交互式分割)和可视化(包括3D渲染)以及用于图像引导治疗研究的软件平台。复制qm文件,粘贴于3D-slicer文件相关文件夹内,\bin\translations\。打开3dslicer,edit菜单下Application Settings,支持的操作系统:Linux,Mac OSX和Windows。本人英语太差,所以第一反应就是中文版,官网无中文版下载,下载后不能直接使用,必须要发布成qm文件;qm文件已经生成,位于ts文件同一文件夹。

linjianping513的博客 9857

八股文C++篇(超级全)

const 说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点。 const int *a==int const *a:都是指a所指向的值不能改,但是a可以指向别的东西 const int a:a变量变成常量,不可修改 int *const a:a的值可以更改,但是指向它的指针不能更改 int const *const a:a本身和指向它的指针都不能更改

m0_50816320的博客 4万+

STM32驱动AD7779:双极性电源下8通道同步ADC的SPI配置与数据采集实战

本文详细介绍了在双极性电源供电下,使用STM32通过SPI接口驱动AD7779同步ADC芯片实现8通道高精度数据采集的实战经验。重点解析了电源设计、抗干扰处理、寄存器配置、SPI通信技巧及数据校准方法,帮助工程师解决工业测量中的同步采样与噪声控制难题。

e3f4g5的博客 370

c++内存分区详解

内存分区 C++的内存划分为栈区、堆区、全局区/静态区、常量存储区、代码区、映射区和一些其他的小东西 虚函数表比较特殊,不同的平台存放的位置不同,gcc编译器将虚表放在常量段 栈区 由系统进行内存的管理 说明:主要存放函数的参数、局部变量以及局部常量。栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M。 #include<iostream> using namespace std; void t

weixin_43914789的博客 600

用python画年度和月度的日历图

用python画各种日历图,可以区分月份来画也可以画一整年的,日历图中可以体现自己的信息

weixin_44853840的博客 2138

Qt5.15.2配置安卓环境

否则,将会跳转到github,你可以自行下载解压到你设置的目录中,然后Qt会自动检测到。以上所需的工具确实有些繁多,而且如果单独下载又涉及科学上网问题,版本问题十分麻烦,好在Qt Creator 4.12之后已经可以自动下载SDK工具,NDK,基础包,openssl,以及gradle等,十分省心。回到正题,无论通过在线安装的方式,安装时勾选了Android,还是编译的方式,编译时编译了Qt Android库,想要使用Qt开发安卓应用仍然需要一些其他工作,包括安装编译安卓项目需要的SDK,NDK等。

weixin_41392061的博客 979

C++—八股文总结(25秋招期间一直更新)

构造函数:构造函数不能被声明为虚函数。因为构造函数是用来创建对象的,而虚函数是根据对象的类型来动态调用的。如果构造函数是虚函数,那么在创建对象时就无法确定调用哪个版本的构造函数,会导致逻辑错误友元函数:友元函数实际上并不属于类的成员函数,所以不能被定义为虚函数普通函数:普通函数只能被重载,不能被重写。

qq_56896418的博客 1355

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

C++中虚函数的原理和虚函数表

一, 什么是虚函数简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略,虚函数是C++的多态性的主要体现,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。下面我们从这段代码中来进行分析:#include using namespace std; class A{ publ

Seanyxie Blog 3120

PLC的自抗扰控制(ADRC)算法

1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清教授的论文和书籍,这里就不赘述了,下面给出梯形图+SCL代码。 1、跟踪微分器 2、线性控制率 3、博图SCL控制代码 4、ADRC控制算法的所有公式汇总 ......

RXXW_Dor的博客 3853

Python爬虫经典案例第67篇:社交媒体平台爬取:Twitter数据采集实战

Twitter(现更名为X)是全球最具影响力的社交媒体平台之一,拥有超过3.3亿月度活跃用户。作为一个实时信息传播平台,Twitter上的数据涵盖了新闻、政治、娱乐、科技等各个领域,具有极高的研究价值:本文将深入探讨Twitter数据采集的技术方案,包括官方API调用、网页爬取和浏览器自动化三种方式。Twitter采用现代化的微服务架构,主要特点包括:Twitter作为全球最大的社交媒体平台,拥有完善的反爬机制:在开始爬取前,需要明确合法的数据采集方式:重要提示:未经授权爬取Twitter数据可能违反服务条

2201_76125261的博客 659

关于C++中虚函数表存放位置的思考

http://blog.chinaunix.net/uid-26611383-id-3772200.html

stay hungry,stay foolish 695

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

a0408152的博客 2079

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

回头太难 3707

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++中类对象的内存布局以及虚函数表生成

类对象内存布局计算l 空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);l 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;l 因此一个对象的大小≥所有非静态成员大小的总和;l 当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;l 虚承继的情况:由

不很正派的专栏 2204

多继承下的虚函数表布局全解析,揭开C++对象内存排布的神秘面纱

深入解析虚函数表的多继承内存布局,揭示C++对象模型核心机制。涵盖多继承场景下虚表分布、地址调整与调用原理,助你掌握高效设计与调试技巧。理解底层逻辑,提升程序性能,值得收藏。

PoliVein的博客 415

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

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

VarChat的博客 879

C++多继承对象内存结构详解(虚函数表布局+菱形继承解决方案)

深入解析C++多继承对象内存结构,揭示虚函数表的多继承内存布局机制。涵盖菱形继承问题成因与虚继承解决方案,适用于复杂类设计场景。理解底层原理,提升程序效率与设计灵活性,值得收藏。

PixelShoal的博客 893

深入C++对象模型:从虚函数表到内存布局的底层原理与实践

面向对象编程(OOP)是一种通过封装、继承和多态来组织代码的编程范式,其核心在于利用对象模拟现实世界以提高代码的可维护性和复用性。在C++中,这一高级抽象通过对象模型与底层硬件紧密连接,其中虚函数表(vtable)和虚表指针(vptr)是实现多态动态绑定的关键机制。理解对象模型对于掌握C++的内存布局、性能优化和调试至关重要,尤其在处理复杂项目或进行深度性能调优时,它能帮助开发者洞察编译器背后的行为。本文以侯捷老师的经典课程为引,聚焦于C++对象模型的核心原理,解析虚函数、继承体系及内存管理的实现细节,旨在

weixin_32175665的博客 284

C++笔记7:多态笔记再整理、多态原理,关于虚函数表,C++对象的内存布局

笔记6中继承与多态都是比较基础的,也并不清楚很多原理,觉得深一点可能就不会了,可是多态又很重要,所以二一下,之后上完课再看看要不要补充个3,加油 关于多态,就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图...

qq_37299596的博客 383

C++对象的内存布局以及虚函数表和虚基表

C++对象的内存布局以及虚函数表和虚基表 本文为整理文章, 参考: http://blog.youkuaiyun.com/haoel/article/details/3081328 http://blog.youkuaiyun.com/angelxf/article/details/7746034 整理的也不到位,还有很多不理解,先记下来。 遇到了一个面试题,是求对象所占空间的大小了。于是想了解一...

weixin_30292745的博客 184

C++虚函数表解析及对象内存布局

<br />两片很好的文章:<br /> <br />虚函数表解析:<br />http://blog.youkuaiyun.com/haoel/archive/2007/12/18/1948051.aspx<br /> <br />对象内存布局(上):<br />http://blog.youkuaiyun.com/haoel/archive/2008/10/15/3081328.aspx<br /> <br />对象内存布局(下):<br />http://blog.youkuaiyun.com/haoel/archive/2008/10

438

C++对象内存布局--②测试派生类跟基类的虚函数表

C++对象内存布局--②测试派生类跟基类的虚函数表 测试2:父类虚函数表跟子类虚函数表是不同的。 //派生类跟基类的虚函数表.cpp//2010年8月18日//测试说明,父类虚函数表跟子类虚函数表是不同的。理解C++对象的内存布局//VS编译器#include <iostream>using namespace std;///////////////////////...

weixin_30482181的博客 90

读C++虚函数表及C++对象的内存布局笔记

C++虚函数表解析:http://blog.youkuaiyun.com/haoel/article/details/1948051 C++对象的内存布局(上):http://blog.youkuaiyun.com/haoel/article/details/3081328 C++对象的内存布局(下):http://blog.youkuaiyun.com/haoel/article/details/3081385

唯手熟尔 847

C++对象模型核心机密:多继承下虚函数表如何布局?(内存对齐与偏移全剖析)

深入解析虚函数表的多继承内存布局,揭示C++对象模型底层机制。涵盖内存对齐、虚表指针偏移及多继承场景下的函数调用路径,助你掌握高效类设计的关键原理。理解本质,提升性能,值得收藏。

SimCompile的博客 889
上一篇: TCP中的四种计时器
下一篇: c++中的is-a关系
code_luck
博客等级 码龄12年 2粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值