问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

C++ 中 sizeof 如何计算 一个多重虚拟继承的类的大小?

发布网友 发布时间:2022-10-05 15:37

我来回答

1个回答

热心网友 时间:2023-10-19 13:17

简单,如果一个基类是虚基类,那么只有一个该类的实例,如果不是虚基类,那么每继承一次,就算一个实例。
然后把所有实例的 size 加起来,就是最终派生类的 size 了。追问为什么 第一个继承(虚拟继承)的基类,有虚函数表,而派生类没有增加新的虚函数。这时派生类使用的是虚基类的虚函数表指针,貌似没有自己的虚函数表指针。如果声明了新的虚函数就增加了4字节(我猜是虚函数表指针)
而如果 第一个继承 (不是虚拟继承),这时候就没有上面的问题。一个基类和派生类公用一个虚函数表。

追答虚继承确实很复杂,为了可以映射各个基类,C++的实现不仅在 vtable 中放置了很多映射指针外,在类的内存布局中,也隐含加入了一些指针来实现映射,而且在含有虚继承的类体系中,基类越多,加入的指针也越多。
C++并未定义标准的布局格式,因为这实际上是属于 ABI 的部分,所以 C++也没法定义一个标准,那么这些就由各编译器厂商自行实现(类似“成员函数指针(pointer to member function)”的情况),这导致了相同的类继承体系,在各个平台上的 size 可能不一致。
所以,你要自己去算一个虚继承的类体系的size,还真不能做这事,还有,我比较好奇,你算这个有什么用?

class a{};class b{};class c:public a,public b{}; 其中sizeof(c...

c类继承a、b类,由于 a类 没成员,b类 也没成员, c 也没新成员,所以 编译器把 sizeof(a),sizeof(b),sizeof(c) 都处理成 1。假定a,b 有成员,就不同了,例如 class a{double x;} -- 8 bytes class b(int y;} -- 4 bytes sizeof(c) 就是 16 bytes 编译器 有自己的...

虚继承的类大小问题?

虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如下图所示。类D继承自类B1、B2,而类B1、B2都继承自类A,因此出现如右图所示的局面...

...求结果及合理的解释。以及把程序中的虚拟继承标志 virtual去掉 后得 ...

sizeof(c) = 3 + 1(该字节因为对齐而空着) + 3 + 1(该字节因为对齐而空着) + 3 + 1(该字节因为对齐而空着) + 4(指向虚函数表的指针) = 16

麻烦大神们用用通俗的解释给我解释一下c++中的虚继承

C++允许多继承,一个类可以继承多个基类,比如:D 类继承了 B1 和 B2 两个类,这本来没什么问题。但是,如果这里的两个基类 B1 和 B2 都是从一个共同的基类 B 那里派生出来的,你就遇到了可怕的“菱形”(继承关系)。造成的问题就是,在 D 类中,B 类的内容继承了两份,不但多占用了空间,...

虚继承虚拟继承入门

void f1(){},vptr的存在会增加内存占用。即使添加更多虚函数,vptr的大小保持不变,所以sizeof(CD)的大小也会有所不同。在实际编程中,除非遇到特定的冲突问题,否则虚拟继承通常不是首选,因为它可能会影响程序的性能和内存管理。理解其工作原理和使用场景,有助于我们做出更明智的设计决策。

java中怎么算一个对象的空间大小

这个类里面的成员变量3个int,1个double,int是4字节,double是8字节 所以对象的大小绝对不会小于20字节,但是T肯定是从Object类继承,那么继承下来这些内容也 占空间,比如方法什么的,所以肯定要大于20字节了 运行下面这个类:import java.io.FileInputStream;import java.io.FileOutputStream;import java...

怎样把全屏DirectDraw程序改写成窗口DirectDraw程序?

WinDir=C:\WINDOWS ; 指明 Win98 所在的目录 WinBootDir=C:\WINDOWS ; 指明启动 Win98 的目录 HostWinBootDrv=C ; 启动驱动器的盘符 [Options] BootMulti=1 ; 1 表示可以进入纯 DOS 方式,0 表示不可以 BootMenu=1 ; 1 表示显示多重启动选单 BootGUI=1 ; 1 表示开机后进入 Win98,0 表示开...

C++中的virtual关键字是什么?怎么用?

);GrandFather * pgfather = new Father;print(pgfather); //祖父类指针变量 return 0; } 4、virtual的继承性:只要基函数定义了virtual,继承类的该函数也就具有virtual属性;即 GrandFather, Father ,Son同时定义virtual void fun()与GrandFather一个定义virtual void fun效果是一样的。

C++中虚函数的作用是什么?它应该怎么用呢?

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。...

C++和JAVA的区别是什么?

C语言是经典的面向过程的编程语言,编程入门一般都学C语言以了解编程以及锻炼逻辑思维能力,在一些跟硬件比较紧密的编程中也经常用到。\x0d\x0a\x0d\x0aC++是在C语言的基础上加入了面向对象的概念,成为混合型面向对象语言,功能强大,但难度也大。\x0d\x0a\x0d\x0aJava是在C++的基础上进行...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
北京环球影城黄油啤酒有纪念杯吗?北京环球影城黄油啤酒纪念杯值不值得... ...跟这个I'll Never Break Your Heart歌名一样 givemeachance中文歌词 有人有<海的女儿>英文版吗? 我已将对方的财产保全法院判决书一下来我申请法院强制执行,但对方玩... 急需一些关于描写海上景物的优美语句,例如描写天,海鸥,去,鱼... A股筑底成功了吗 关于钢琴如何考级成功 ...可是就是节奏很不稳,这是不是和性格有关,怎样才能让我的节奏稳一些... 真实之泪的游戏相簿一共有八个角色,但是我通关时候都只有7个,第八个是... 如何计算自定义类类型的大小 带有指针数组的结构体类型大小怎么计算 使用sizeof计算类的大小 07版word文档中分页符前后字体相一致 我家的力克全自动裁剪机刀片为什么需要经常更换? 断续切削使用什么刀片好 矜宸本帮素鸭的做法步骤图,怎么做好吃 男士秋冬攻略之如何挑选夹克? 入秋了,有什么好的男茄克外套吗?想给老公买 两件夹克衫都以120元售出,一件赚了1/5,另一件赔了1/5,请你算一算卖出这两件衣服是赔了还是赚了?若赚 买四件同样的夹克衫,要用680元,如果这些钱去买裤子,可以买八条,有条裤子比每件夹克衫便宜多少元? 长按复制这条信息,打开手机淘宝即可看到【2015秋季新品大码品牌女装短外套棒球服女夹克开衫 服装店夹克衫40件1件35元t恤31件20元某天收入1500元最少卖多少件? 宝马牌夹克衫值多少钱 江南素鸭的做法,江南素鸭怎么做好吃,江南素鸭的家常 直角三角形两个边的平方是否等于斜边的平方 小龟王电动车和女皇电动自行车选择 小龟王的车后胎 3.5-10的,我想换个宽点的轮胎 雅迪小龟王A/C-W什么意思 小龟王电动车原装轮毂多少寸? 客厅鱼缸上面墙能挂照片吗 简述屋面雨水的外排与没排 原地推铅球教学视频 原地推铅球训练方法 骐达轮胎是多大? 有组织排水的优缺点和适用范围是什么? 学习英语的四个禁区,小伙伴们知道是什么吗,可以聊一聊吗? 货车换大梁需要什么东西到车管所里面备案 汽车换大梁要哪些手续? 半挂车换过大梁怎么往外省提户 牵引自卸车换大梁需要手续 更换大梁备案需要上线吗 qq的情侣空间怎么找不到了,QQ情侣空间在哪里找 商品房延期交付可以延期交尾款吗 小清新优美的句子 一幅油画,是靠墙画了一堆花盆,也有一张是单独的一个花盆,*调为主,请问是那位大师画的 邮快递必须留电话号码吗? 邮寄需要电话号码吗? 大海螺怎么煮 达人教你如何轻松制作美食 "我在宜昌上班
  • 焦点

最新推荐

猜你喜欢

热门推荐