namespace test_class_size
{
class A
{
public:
protected:
private:
};
class B{
public:
protected:
private:
};
class C:public A,public B{
public:
protected:
private:
};
class D:virtual public A
{
public:
protected:
private:
};
class E:virtual public A,virtual public B{
public:
protected:
private:
};
class F{
public:
int a;
static int b;
protected:
private:
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //1
cout<<"sizeof(B)="<<sizeof(B)<<endl; //1
cout<<"sizeof(C)="<<sizeof(C)<<endl; //1
cout<<"sizeof(D)="<<sizeof(D)<<endl; //8 虚继承指向虚基类的指针
cout<<"sizeof(E)="<<sizeof(E)<<endl; //8 共享虚继承指向虚基类的指针
cout<<"sizeof(F)="<<sizeof(F)<<endl; //4
}
}
namespace test_class_size2
{
struct A {
int a;
virtual ~A(){}
};
struct B:virtual public A{
virtual ~B(){}
virtual void myfunB(){}
};
struct C:virtual public A{
virtual ~C(){}
virtual void myfunC(){}
};
struct D:public B,public C{
virtual ~D(){}
virtual void myfunD(){}
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //16 int对齐到8字节+8字节的虚指针
cout<<"sizeof(B)="<<sizeof(B)<<endl; //24 在上面的基础上+8字节的指向虚基类的指针
cout<<"sizeof(C)="<<sizeof(C)<<endl; //24 //同上
cout<<"sizeof(D)="<<sizeof(D)<<endl; //32 //一个A的副本,在上面的基础上+一个从B或C里面指向A的指针
}
}
namespace test_class_size3
{
struct A {
int a;
virtual ~A(){}
};
struct B: public A{
virtual ~B(){}
virtual void myfunB(){}
};
struct C: public A{
virtual ~C(){}
virtual void myfunC(){}
};
struct D:public B,public C{
virtual ~D(){}
virtual void myfunD(){}
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //16
cout<<"sizeof(B)="<<sizeof(B)<<endl; //16
cout<<"sizeof(C)="<<sizeof(C)<<endl; //16
cout<<"sizeof(D)="<<sizeof(D)<<endl; //32
}
{
class A
{
public:
protected:
private:
};
class B{
public:
protected:
private:
};
class C:public A,public B{
public:
protected:
private:
};
class D:virtual public A
{
public:
protected:
private:
};
class E:virtual public A,virtual public B{
public:
protected:
private:
};
class F{
public:
int a;
static int b;
protected:
private:
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //1
cout<<"sizeof(B)="<<sizeof(B)<<endl; //1
cout<<"sizeof(C)="<<sizeof(C)<<endl; //1
cout<<"sizeof(D)="<<sizeof(D)<<endl; //8 虚继承指向虚基类的指针
cout<<"sizeof(E)="<<sizeof(E)<<endl; //8 共享虚继承指向虚基类的指针
cout<<"sizeof(F)="<<sizeof(F)<<endl; //4
}
}
namespace test_class_size2
{
struct A {
int a;
virtual ~A(){}
};
struct B:virtual public A{
virtual ~B(){}
virtual void myfunB(){}
};
struct C:virtual public A{
virtual ~C(){}
virtual void myfunC(){}
};
struct D:public B,public C{
virtual ~D(){}
virtual void myfunD(){}
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //16 int对齐到8字节+8字节的虚指针
cout<<"sizeof(B)="<<sizeof(B)<<endl; //24 在上面的基础上+8字节的指向虚基类的指针
cout<<"sizeof(C)="<<sizeof(C)<<endl; //24 //同上
cout<<"sizeof(D)="<<sizeof(D)<<endl; //32 //一个A的副本,在上面的基础上+一个从B或C里面指向A的指针
}
}
namespace test_class_size3
{
struct A {
int a;
virtual ~A(){}
};
struct B: public A{
virtual ~B(){}
virtual void myfunB(){}
};
struct C: public A{
virtual ~C(){}
virtual void myfunC(){}
};
struct D:public B,public C{
virtual ~D(){}
virtual void myfunD(){}
};
void test()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl; //16
cout<<"sizeof(B)="<<sizeof(B)<<endl; //16
cout<<"sizeof(C)="<<sizeof(C)<<endl; //16
cout<<"sizeof(D)="<<sizeof(D)<<endl; //32
}
}
namespace test_class_size2解释:A中int+虚表指针(16)。B,C中由于是虚继承因此大小为A+指向虚基类的指针,B,C虽然加入了自己的虚函数,但是虚表指针是和基类共享的,因此不会有自己的虚表指针。D由于B,C都是虚继承,因此D只包含一个A的副本,于是D大小就等于A+B中的指向虚基类的指针+C中的指向虚基类的指针。(16+8+8)
namespace test_class_size3解释:A中int+虚表指针(16)。D由于B,C不是虚继承,因此D包含两个A的副本,于是D大小就等于A+A的大小。