大伙儿解释下为什么函数地址会不一样

大家解释下为什么函数地址会不一样
eff.h

#pragma once


#include "stdio.h"

class ChangeAlpha
{
protected:
virtual void Enter();
public:
virtual void OnEnterFrame();
};
class ChangeAlpha_Layer4:public ChangeAlpha
{
protected:
virtual void Enter();
public:
virtual void OnEnterFrame();

};


eff.cpp

#include "eff.h"


void ChangeAlpha::Enter()
{
printf("%d\r\n",&ChangeAlpha::OnEnterFrame);
}

void ChangeAlpha::OnEnterFrame(  )
{

}

void ChangeAlpha_Layer4::Enter()
{
printf("%d\r\n",&ChangeAlpha_Layer4::OnEnterFrame);
}

void ChangeAlpha_Layer4::OnEnterFrame( )
{

}


main.cpp

#include "eff.h"
class Effect_test:public ChangeAlpha_Layer4
{
public:
Effect_test()
{
Enter();
}
virtual void Enter()
{
printf("%d\r\n",&ChangeAlpha_Layer4::OnEnterFrame);
ChangeAlpha_Layer4::Enter();

}
};
int _tmain(int argc, _TCHAR* argv[])
{    
Effect_test p;
return 0;
}


但如果我不写eff.cpp

把实现写到eff.h,打印地址就一样了

又或者我把ChangeAlpha类删掉,ChangeAlpha_Layer4不继承ChangeAlpha,打印地址也是一样的

再者把编译环境弄到release,打印地址也是一样的

我用的是VS2010,debug虚函数指针有危险?
 
函数地址

------解决方案--------------------
《深度探索C++对象模型》
《C++反汇编与逆向分析技术揭秘》
------解决方案--------------------
用%p一样的不行的,不用试了
成员函数指针不是普通指针,也不能隐式的转换成void *。成员函数指针在vc下的sizeof有sizeof(void *)+2的大小,32位平台下可以看到有6字节。虚函数最好不要去探究它的函数地址(因为多态的实现方式造成的),很容易导致兼容性问题。从地址使用虚函数,结果是未定义的