【C++总结记载】类对象、继承、虚继承、虚函数表

c++虚继承对象的内存布局 c++虚继承对象的内存布局               --VC7.1特别版网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错:一是陈皓的《C++ 对象的内存布 阅读详情

关于虚函数表,可见博客    传送    ,但是要注意,一般被继承的第一个基类的虚函数表合并至子类的虚函数表,(基类的虚函数在前,除非有虚函数覆盖,子类的虚函数在后)

主要讲了在无虚继承情况下各种情况的虚函数表的情况,

因此,就牵扯到了类的大小的问题:

1)对于一个空类,sizeof=1;

2)静态成员不属于类大小中,且成员函数也不属于类大小中

3)类与继承情况下类的大小:

情况一:   无虚函数继承,但有虚函数的情况

class A 
{
public:
	char a[3];	
	virtual void fa() {};
};

class B :  public  A
{
public:
	char b[3];
	virtual void fa() {};
	
};

class C : public  A
{
public:
	char c[3];	
	virtual void bb() {};
};


int main() {
	
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
}

结果是:VS2015   debug   x86

sizeof(A) = 8   

              = A的虚函数表指针的4字节+char对齐的4字节

 

sizeof(B) = 12   

              = B的虚函数表指针的4字节 + 类B中char对齐的4字节+类A中char对齐的4字节 

 

sizeof(C) = 12   

              = C的虚函数表指针的4字节 + 类C中char对齐的4字节+类A中char对齐的4字节 

情况二:   虚函数继承,有虚函数的情况

class A 
{
public:
	char a[3];	
	virtual void fa() {};
};

class B :  virtual public  A
{
public:
	char b[3];
	virtual void fa() {}; //虚函数覆盖
	
};

class C : virtual public  A
{
public:
	char c[3];	
	virtual void bb() {}; //无虚函数覆盖
};

class D :public B, public C
{
public:
	char d[3];
	
};

int main() {
	
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
	cout << sizeof(D) << endl;
}

 

虚继承:虚继承的提出是为了解决多重继承时,可能会保存两份副本的问题,也就是说用了虚继承就只保留了一份副本,但是这个副本是被多重继承的基类所共享的。

 

虚继承底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。

因此 :要考虑虚函数表指针和虚基类指针

 

结果是:VS2015   debug   x86

sizeof(A) = 8   

              = A的虚函数表指针的4字节+char对齐的4字节

sizeof(B) = 16  

              =  指向A的虚基类指针4字节+类B中char对齐的4字节  + 类A的虚函数表指针4字节(覆盖的虚函数)+ 类A中char对齐的4字节

sizeof(C) = 20   

              = C的虚函数表指针的4字节(没有覆盖的虚函数) +指向A的虚基类指针4字节+类C中char对齐的4字节 + 类A的虚函数表指针4字节 + 类A中char对齐的4字节

sizeof(D) = 32

             = 类C的虚函数表指针的4字节(有虚函数表指针,可以合并类D的虚函数)+类C中的指向A的虚基类指针4字节 +类C中char对齐的4字节+类B中的指向A的虚基类指针4字节 +类B中char对齐的4字节+类D中char对齐的4字节 + 共享类A中虚函数表指针4字节+共享类A中char对齐的4字节

 

注意:若类B中有虚函数表指针,则类D中类B应该在类C的前边,并且类B的虚函数表应该合并类D的虚函数表

 

 

由上可见,虚基类的内存都在最后。。

 

C++ 多态 虚函数 虚函数表 最是详细 高质量的C++多态讲解,详细讲解虚函数,虚函数表,虚函数继承,虚函数继承下的内存分配等 立即下载

相关推荐

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8204

c++ - 虚函数表

1.什么是虚函数表 所谓虚函数表就是存放着当前类中所有虚函数地址的表。在实例化一个具有虚函数的类时,这个表 也被分配到这个实例对象的内存中,通过虚函数表可以指明所要调用的函数的位置。在C++编译器 中虚函数表的地址存放在对象的最前面,这是为了即使多继承下也能快速获取到虚函数表。 代码示例: class Base{ public: virtual void A(){cout << "Base::A()" << endl;} virtual void B(){cout &

weixin_49303682的博客 2821

最邻近点对问题(Closest-Pair Problem):二维的分治解法详解

低维时,最邻近点对问题可以利用分治求解。但是网络上相关资料良莠不齐,对于3维甚至难有有价值的参考。最近恰巧梳理了123维最邻近点对问题的相关知识,故在此分享。这是该系列的第二篇,介绍二维情况的分治解法。

Carl_Rabbit的博客 1万+

C++ 多态之虚函数表

C++ 虚函数表原理剖析

索命的博客 2055

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 925

告别复杂模型:用UFLD算法5分钟搞定车道线检测(附Python代码)

本文介绍了UFLD(Ultra Fast Lane Detection)算法在车道线检测中的高效应用,仅需5行核心代码即可实现实时检测,特别适合边缘计算设备。通过对比传统方法,UFLD在推理速度、模型大小和硬件需求上具有显著优势,是深度学习领域轻量级解决方案的典范。

weixin_27872611的博客 288

C++虚函数表

为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。

记录成长的博客 477

Android 桌面小组件 AppWidgetProvider

桌面小组件,绝对是小程序中的小程序,说白了就是任何复杂一丁点的操作都适合做成桌面小组件。所以这里采用的演示的例子,就只有一个白色圆角背景,外加一个文本框,显示文字。小组件的教程网上一搜一大堆,所以我这里主要就是介绍一些坑的地方,跟大致处理流程,具体细节还得看其他大神的骚操作。

qq_33601179的博客 6584

C++ 虚函数表

public ://和上上个类不同的是多了一个自身定义的虚函数. 和上个类不同的是没有基类虚函数的覆盖. virtual void derive1_fun1() {} };为嘛呢?现在继承类明明定义了自身的虚函数,但不见了?类对象的大小,以及成员偏移情况居然没有变化!要注意:我为什么使用指针的方式调用?说明一下:因为如果不使用指针调用,虚函数调用是不会发生动态绑定的哦!你若直接 d1.derive1_fun1();

Cdreamfly的博客 6816

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1190

多继承,虚继承,虚函数下的内存布局

多继承是指一个派生类继承多个基类;多继承想要节省空间就需要用到虚继承,因此多继承或者说虚继承的一个弊端也显而易见,在菱形继承之下,B 继承A,C 继承A,D多继承B 和C,这样需要声明D 虚继承B和C ,还要在D的构造中指明A的构造方式。这样一来,D在看不到A的情况下,仍然需要指明A的继承方式。 虚继承是指为了节省空间而将相同的数据区域使用虚基类指针而代替的一种继承方式(在C++中而言),虚基类...

shang_12266029的博客 554

客服转人工率直降60%!OpenClaw深度集成NLP引擎,打造企业级对话自动化智能客服系统

本文介绍了一套基于OpenClaw智能体框架和NLP大模型引擎的智能客服系统解决方案。该系统通过深度集成NLP引擎实现精准语义理解,采用分层架构设计支持多渠道接入和业务系统对接,显著提升了客服效率。核心亮点包括:92%的重复问题自动解决率,60%的转人工率下降,40%的人力成本降低,以及从30秒压缩至0.5秒的平均响应时长。文章详细阐述了技术选型、系统架构设计、核心模块实现等关键环节,展示了如何通过智能对话系统破解传统客服业务中的人力资源与服务质量矛盾。

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

c++虚继承对象的内存布局(修改版)

c++虚继承对象的内存布局(修改版)               网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside TheC++ Object Model 侯捷译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错: 一是陈皓的《C++ 对象的内存布局》图文并貌,

lingfengtengfei的专栏 1524

jre9下载 jdk9

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

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

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

C++虚继承与虚函数

虚继承在菱形继承中出现的数据二义性问题,使得数据访问时变得复杂,并且导致了数据冗存。虚继承则解决了从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题。关键字:virtual用法:将共同基类声明设置为虚基类,这时从不同路径继承过来的同名数据成员在内存中只有一份,同一个函数名也只有一个映射。语法: class 派生类: virtual 基类1,virtual 基类2,…,virtu

胡小哲的博客 2414

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++虚继承的内存结构

我用vc2003观测到的实际情况是。在类中增加一个指针(VBPTR)指向一个VBTBL,这个VBTBL的第一项记载的是从VBPTR 与本类的偏移地址,如果本类有虚函数,那么第一项是FF FF FF FC(也就是-4),如果没有则是零,第二项起是VBPTR与本类的虚基类的偏移值。vc2003的这种方案个人觉得没有Bjarne的好,一是要多一个指针,二是因为VBPTR与虚函数表分开设计,也不便于修改。

BUPT_LX的专栏 1115

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++虚继承(十) --- 谈谈陈皓遗留的问题

网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错: 一是陈皓的《C++ 对象的内存布局》图文并貌,写得很是详细。地址是http://blog.youkuaiyun.com/haoel/

liujiayu2的专栏 561

c++虚继承对象的内存布局(修改版)

c++虚继承对象的内存布局(修改版)               网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside TheC++ Object Model 侯捷译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错: 一是陈皓的《C++ 对象的内存布局》图文并

ahuang1900的专栏 665
上一篇: 【算法刷题】子序列个数
下一篇: 【算法刷题】字符串的组合(非排列)
Neo_dot
博客等级 码龄9年 3粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值