之前有对虚函数机制的讲解,见这

讨论是多级继承的虚函数表。

首先是没有函数覆盖的情况,继承方式如下图所示:

 

C++中的虚函数继承与虚继承
 对于实例DDerive dd;其所对应的虚函数列表是:

 

 

C++中的虚函数继承与虚继承
测试代码如下:

 

class Base{
    public:
        typedef void (Base::*Fun)();
        virtual void f(){
            Fun q=&Base::f;
            cout<<"Base::f -> "<<(int)*(void**)&q<<endl;
        }
        virtual void g(){
            Fun q=&Base::g;
            cout<<"Base::g -> "<<(int)*(void**)&q<<endl;
        }
};
class Derive:public Base{
    public:
        typedef void (Derive::*Fun)();
        virtual void f1(){
            Fun q=&Derive::f1;
            cout<<"Derive::f1 -> "<<(int)*(void**)&q<<endl;
        }
        virtual void g1(){
            Fun q=&Derive::g1;
            cout<<"Derive::g1 -> "<<(int)*(void**)&q<<endl;
        }
};
class DDerive:public Derive{
    public:
        typedef void (DDerive::*Fun)();
        virtual void f2(){
            Fun q=&DDerive::f2;
            cout<<"DDerive::f2 -> "<<(int)*(void**)&q<<endl;
        }
        virtual void g2(){
            Fun q=&DDerive::g2;
            cout<<"DDerive::g2 -> "<<(int)*(void**)&q<<endl;
        }
};
int test2(){
    typedef void (*Fun)();
    Base b;
    Fun pFun=NULL;
    int *add;
    cout<<"Base-虚函数表地址:"<<(int*)&b<<" sizeof(Base)="<<sizeof(Base)<<endl;
    add=(int*)*(int*)&b;
    cout<<"虚函数表-第1个函数地址:"<<add<<" -> "<<(int*)(*add)<<endl;
    cout<<"虚函数表-第2个函数地址:"<<add+1<<" -> "<<(int*)*(add+1)<<endl;
    for(int i=0;i<2;i++)
    {
    pFun=(Fun)*(add+i);
    pFun();
    }
    cout<<"=================================="<<endl;
    Derive d;
    cout<<"Derive-虚函数表地址:"<<(int*)&d<<" sizeof(Derive)="<<sizeof(Derive)<<endl;
    add=(int*)*(int*)&d;
    cout<<"虚函数表-第1个函数地址:"<<add<<" -> "<<(int*)(*add)<<endl;
    cout<<"虚函数表-第2个函数地址:"<<add+1<<" -> "<<(int*)*(add+1)<<endl;
    cout<<"虚函数表-第3个函数地址:"<<add+2<<" -> "<<(int*)*(add+2)<<endl;
    cout<<"虚函数表-第4个函数地址:"<<add+3<<" -> "<<(int*)*(add+3)<<endl;
    for(int i=0;i<4;i++)
    {
    pFun=(Fun)*(add+i);
    pFun();
    }
    cout<<"=================================="<<endl;
    DDerive dd;
    cout<<"DDerive-虚函数表地址:"<<(int*)&dd<<" sizeof(DDerive)="<<sizeof(DDerive)<<endl;
    add=(int*)*(int*)&dd;
    cout<<"虚函数表-第1个函数地址:"<<add<<" -> "<<(int*)(*add)<<endl;
    cout<<"虚函数表-第2个函数地址:"<<add+1<<" -> "<<(int*)*(add+1)<<endl;
    cout<<"虚函数表-第3个函数地址:"<<add+2<<" -> "<<(int*)*(add+2)<<endl;
    cout<<"虚函数表-第4个函数地址:"<<add+3<<" -> "<<(int*)*(add+3)<<endl;
    cout<<"虚函数表-第5个函数地址:"<<add+2<<" -> "<<(int*)*(add+4)<<endl;
    cout<<"虚函数表-第6个函数地址:"<<add+3<<" -> "<<(int*)*(add+5)<<endl;
    for(int i=0;i<6;i++)
    {
    pFun=(Fun)*(add+i);
    pFun();
    }
    return 0;
}

相关文章:

  • 2021-09-05
  • 2021-08-29
  • 2022-01-23
  • 2021-11-10
  • 2022-12-23
  • 2021-12-31
猜你喜欢
  • 2021-11-08
  • 2021-07-07
  • 2022-12-23
  • 2022-12-23
  • 2021-08-24
  • 2021-10-26
相关资源
相似解决方案