天天看點

虛函數指針sizeof不為sizeof(void*)

一個繼承了兩個虛基類又增加了自己的一個虛函數pif的類,sizeof(指向pif的指針)竟然是8(X86)。

我是從這裡http://www.codeproject.com/KB/cpp/FastDelegate.aspx看到的。

試驗代碼(VS2010,Win32)

#include <iostream>

#include <cstdlib>

class CBase

{

public:

    int a;

    int b;

    int c;

    int d;

    int e;

    virtual void fa(){std::cout<<"base fa"<<std::endl;}

    virtual void fb(){std::cout<<"base fb"<<std::endl;}

};

class CBase2

    virtual void f2a(){std::cout<<"base2 fa"<<std::endl;}

    virtual void f2b(){std::cout<<"base2 fb"<<std::endl;}

class CInh:public CBase,public CBase2

    virtual void fa(){std::cout<<"inh fa"<<std::endl;}

    virtual void fb(){std::cout<<"inh fb"<<std::endl;}

    virtual void f2a()

    {

        std::cout<<"inh f2a"<<std::endl;

        CInh *p=this;

    }

    //virtual void f2b(){std::cout<<"inh f2b"<<std::endl;}

    virtual void fia(){};

int main()

    typedef void (CInh::* pf_t)(void);

    std::cout<<sizeof(pf_t)<<std::endl;//輸出8

    pf_t pft=&CInh::fia;

    int n=5;

    int *pn=&n;

    void *pv=pn;

    pf_t *ppp=(pf_t *)pv;

    typedef void (CBase2::* func_t)(void);

    std::cout<<sizeof(func_t)<<std::endl;

    CInh *a=new CInh;

    a->f2a();

    func_t pf=&CBase2::f2b;

    (a->*pf)();

    std::cout<<&a<<std::endl;

    std::cout<<(CBase *)(&a)<<std::endl;

    std::cout<<(CBase2 *)(&a)<<std::endl;

    std::cout<<(CInh *)(CBase2 *)(&a)<<std::endl;

    CBase2 *p=a;

    p->f2a();

    std::system("pause");

    return 0;

}

問題:

标準裡對指針的size是怎麼規定的?

如果指針的size是編譯器相關的話,那麼用int來儲存各種指針豈不是不可靠的了?就是說将指針轉換為int可能會丢失資訊?可是印象中好多代碼是這樣寫的啊?