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++的基础上进行...