对一个类求sizeof,虚继承

转帖:http://blog.sina.com.cn/s/blog_728161840100u2ib.html

一、空类

求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。

class  A
{
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 1

    return 0;
}

二、简单的类

这个也好求,就是sizeof(A.a)+4(指向虚表的指针)

class  A
{
    int a;
    virtual void fun1();
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 8

    return 0;
}

三、子类普通继承、父类中不含虚函数

sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)

class  A
{
    int a;
};

class B:public A
{
     int b;
     virtual void fun();
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 4
    int b = sizeof(B); // b = 12

    return 0;
}

四、子类普通继承、父类含虚函数

sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)

class  A
{
    int a;
    virtual void fun1();
};

class B:public A
{
     int b;
     virtual void fun();
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 8
    int b = sizeof(B); // b =12

    return 0;
}

五、子类虚继承、父类不含虚函数

sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)

class  A
{
    int a;
};

class B:virtual public A
{
     int b;
     virtual void fun();
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 4
    int b = sizeof(B); // b = 16

    return 0;
}

六、子类虚继承、父类含虚函数

sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。

class  A
{
    int a;
    virtual void fun1();
};

class B:virtual public A
{
     int b;
     virtual void fun();
};

int _tmain(int argc, _TCHAR* argv[])
{

    int a = sizeof(A); // a = 8
    int b = sizeof(B); // b =20

    return 0;
}
原文地址:https://www.cnblogs.com/wangxiaokun/p/7063846.html