对一个类求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; }