c++ - 虚拟继承中派生类的sizeof
问题描述
在浏览虚拟基类时,我知道为了避免歧义并节省空间,我们使用虚拟基类。我用简单的程序检查了这个概念,如下所示的 CodeBlocks
#include <iostream>
using namespace std;
class A
{
public:
int a;
};
class B : public virtual A
{
public:
int b;
};
class C : public virtual A
{
public:
int c;
};
class D: public B, public C
{
public:
int d;
};
int main()
{
cout<<"sizeof(int) "<<sizeof(int)<<endl;
cout<<"sizeof(A) "<<sizeof(A)<<endl;
cout<<"sizeof(B) "<<sizeof(B)<<endl;
cout<<"sizeof(C) "<<sizeof(C)<<endl;
cout<<"sizeof(D) "<<sizeof(D)<<endl;
return 0;
}
输出为:
sizeof(int) 4
sizeof(A) 4
sizeof(B) 12
sizeof(C) 12
sizeof(D) 24
我理解了前 4 行输出背后的逻辑,但我不明白为什么sizeof(D) 24应该是 4(int d) + 4(int c) + 4(int b) + 4(int a ) + 4(由于一些虚拟基指针)= 20。这里的“a”由于虚拟基类而只继承一次,因此我应该得到20作为 sizeof(D),但它是 24。
有人请分析并帮助我...
解决方案
看看 B 的代码大小是 12,C 的大小是 12,所以 D 继承了 B 和 C 的所有内容,因此取决于编译器和 C++ 版本,它们中的大多数只是 D 的大小是 B+C 或即 24。但不是每个编译器都做同样的事情,所以除非我们知道你的 C++ 版本和编译器版本,否则我们无法得出任何结论,而且 IDE 也有很大的不同。
推荐阅读
- c# - DownloadFileAsync 下载损坏的文件
- python - 如何从包含的可调用对象中使用 config.add_settings({'pyramid.includes': ...})
- c - C:执行 I/O 操作并发送信号导致 select() 不断被中断?
- python - 具有可变输入形状的 Keras
- haskell - 具有固定大小的完美平衡树的问题
- javascript - 授权承载令牌的邮递员预请求脚本
- kotlin - 在 kotlin 是否有任何 hacky 方法来重新分配参数
- angular - 什么是 ViewChild 的好用例阅读:ElementRef
- python - 将数据结构(集合)存储为文件但不将其加载到内存中
- python-3.x - 月份格式化为名称时对日期时间列进行排序