返回信息流#include <iostream>
using namespace std;
class A
{
public:
char a;
}aa;
class B:virtual public A
{
public:
char b;
}bb;
class C:virtual public A
{
public:
char c;
}cc;
class D:public B,public C
{
public:
char d;
}dd;
sizeof(A) = 1
sizeof(B) = 9
sizeof(C) = 9
sizeof(D) = 21
最后一个不理解,B和C中虚指针,D中除了把B和C中的虚指针包括进来D自己还有虚指针吗?还有D中是不是只包含一份A::a?
这是一条镜像帖。来源:北邮人论坛 / cpp / #29261同步于 2009/9/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【请教】虚继承的类大小
dongri
2009/9/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个问题其实很早就一直在讨论了,想当年我是讨论得相当激烈啊,哎,现在累了,多余的话就不说啦。推荐你看篇网上的文章 《逆向C++》文章名好像忘,应该差不多是这个名字
http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=26843&pos=5
1、 首先class A ,有一个 char a; 所以 sizeof(A) = 1;
2、 接着class B , class C 都是虚继承与 class A的所以, A的大小要保留;
由于class B, class C都有虚继承自class A 所以 B, C里面都有一个__vptr__B, __vptr__C, 他们的大小为int 的大小,也就是4bytes (Win32系统下)
其次是B, C里面有一个自己的数据成员, 及占 1byte.
但是对于编译器来说, 需要内存对齐;( 你可能为什么A不需要对齐, 那是因为它的数据成员的大小都小于int)
所以B, C的大小为: sizeof( B ) = 1 + 4 + 1 + 3 ( 最后一个 3 是内存对齐所需的大小)
3、 class D 继承B, C 而B, C是虚继承自 A, 所以D中只有一个A的数据成员
对于D 中要存有 B, C的subobject . 再者就是D自身的一个char 占一个字符 (但是也得内存对齐 , 所以要加 3 )
因此 sizeof( D ) = sizeof (A) + [ sizeof( B ) - sizeof(A) ] + [ sizeof( C ) - sizeof( A) ] + 1 + 3 ;
不知道你现在有没有明白, 如果还是没有的话, qq: 272015303 联系!
【 在 dongri 的 大作中提到: 】
#include <iostream>
using namespace std;
class A
{
public:
char a;
}aa;
class B:virtual public A
{
public:
char b;
}bb;
class C:virtual public A
{
public:
char c;
}cc;
class D:public B,public C
{
public:
char d;
}dd;
sizeof(A) = 1
sizeof(B) = 9
sizeof(C) = 9
sizeof(D) = 21
最后一个不理解,B和C中虚指针,D中除了把B和C中的虚指针包括进来D自己还有虚指针吗?还有D中是不是只包含一份A::a?
1、 首先class A ,有一个 char a; 所以 sizeof(A) = 1;
2、 接着class B , class C 都是虚继承与 class A的所以, A的大小要保留;
由于class B, class C都有虚继承自class A 所以 B, C里面都有一个__vptr__B, __vptr__C, 他们的大小为int 的大小,也就是4bytes (Win32系统下)
其次是B, C里面有一个自己的数据成员, 及占 1byte.
但是对于编译器来说, 需要内存对齐;( 你可能为什么A不需要对齐, 那是因为它的数据成员的大小都小于int)
所以B, C的大小为: sizeof( B ) = 1 + 4 + 1 + 3 ( 最后一个 3 是内存对齐所需的大小)
3、 class D 继承B, C 而B, C是虚继承自 A, 所以D中只有一个A的数据成员
对于D 中要存有 B, C的subobject . 再者就是D自身的一个char 占一个字符 (但是也得内存对齐 , 所以要加 3 )
因此 sizeof( D ) = sizeof (A) + [ sizeof( B ) - sizeof(A) ] + [ sizeof( C ) - sizeof( A) ] + 1 + 3 ;
这个加三是因为D中的数据成员含vptr_B和vptr_C?要跟这个对齐?
把内存对齐去了你会看的更清楚:
#include <iostream>
#pragma pack(1)
using namespace std;
class A
{
public:
char a;
}aa;
class B:virtual public A
{
public:
char b;
}bb;
class C:virtual public A
{
public:
char c;
}cc;
class D:public B,public C
{
public:
char d;
}dd;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
cout<<sizeof(D)<<endl;
return 0;
}
Output:
1
6
6
12