参考:http://www.cnblogs.com/studentdeng/archive/2010/06/07/1753485.html
这里通过一个个实例,说明类的大小,空类大小为1.
//8: pavtable, a
class A
{
public:
int a;
void af();
void virtual vaf();
};
void A::vaf(){printf("vaf/n");}
void A::af(){printf("af/n");}
//8: pbvtable, b
class B
{
public:
int b;
void bf();
void virtual vbf();
};
void B::vbf(){printf("vbf/n");};
void B::bf(){printf("bf/n");};
//类C没有虚基类,没有自己的vtable. 这样会先将非虚基类的内存放前辈,其后是本类的成员变量
//12 pavtable, a, c
//pavtable: vaf, vcf
class C: public A
{
int c;
void cf();
virtual void vcf();
};
void C::vcf(){printf("vcf/n");}
void C::cf(){printf("cf/n");}
//这里无法从非虚基类得到虚函数表,增加一个
//20: pdvtable, pavtalble, d, pavtalble, a
class D :virtual public A
{
int d;
void df();
void virtual vdf();
};
void D::vdf(){printf("vdf/n");}
void D::df(){printf("df/n");}
//无法从无虚基类得到vtable,自增加一个
//28: ptvtalbe, ptvbtable, t, pavtable,a, pbvtable,b
class T :virtual public A, virtual public B
{
int t;
void tf();
void virtual vtf();
};
void T::vtf(){printf("vtf/n");}
void T::tf(){printf("tf/n");}
//无法从无虚基类得到vtable,自增加一个
//20: pevtable, pevbtable, e, pavtable, a
class E :virtual public A
{
public:
int e;
void ef();
void virtual vef();
};
void E::vef(){printf("vef/n");}
void E::ef(){printf("ef/n");}
//这时从基类得到vtable,可以把自己虚函数赋上去
//36: pdvtable, pdvbtable, d, pevtalbe,pdvbtalbe,e f pavtalbe,a
//dvtable:vdf, vff
class F : public D, public E
{
public:
int f;
void ff();
void virtual vff();
};
void F::vff(){printf("vff/n");}
void F::ff(){printf("ff/n");}
//无法从无虚基类得到vtable,自增加一个
//44, pgvtable,pgvbtable,g, pavtable,a, pdvtable,pdvbtable,d, pevtable,pavbtable,e,
class G :virtual public D, virtual public E
{
public:
int g;
void gg();
void virtual vgg();
};
void G::vgg(){printf("vgg/n");}
void G::gg(){printf("gg/n");}
可以通过以下的方法做函数调用测试:
typedef void(*Fun)(void);
F b;
Fun pFun = NULL;
// pFun = (Fun)*((int*)*((int*)(&b)));
pFun = (Fun)*((int*)*((int*)(&b)+7)+0);
pFun();