求一个类的sizeof应考虑的问题

来源:互联网 发布:ubuntu安装vim8离线包 编辑:程序博客网 时间:2024/05/16 17:00
一、个空类
class A
};
    求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
二、简单的类
class A
{
    int a;
    virtual fun();
}
    这个也好求,就是sizeof(A.a)+4(指向虚表的指针)
三、子类普通继承、父类中不含虚函数
class  A
{
    int a;
}
class B:public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)
四、子类普通继承、父类含虚函数
class  A
{
    int a;
    virtual fun1();
}
class B:public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向续表的指针即可;
五、子类虚继承、父类不含虚函数
class  A
{
    int a;
   
}
class B:virtual public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
六、子类虚继承、父类含虚函数
class  A
{
    int a;
    virtual fun1();
   
}
class B:virtual public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。
0 0
原创粉丝点击