一個繼承了兩個虛基類又增加了自己的一個虛函數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可能會丢失資訊?可是印象中好多代碼是這樣寫的啊?