多重继承虚基类大小

参考: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(); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值