#include<iostream>
using namespace std;
void gf(){ cout<<"::gf()"; }
typedef void(*F)();
int main()
{
gf();
F f=gf;
printf("%p \n",f);//杈撳嚭鐨勬槸00434F55
system("pause");
}
VS2005涓嬫柇鐐癸紝娣誨姞鐩戣錛?br>
涓轟粈涔堣緭鍑虹殑鍑芥暟鍦板潃鍜孷S鐩戣鍒扮殑涓嶅悓錛?br>絳旓細杈撳嚭鐨勬槸璺寵漿鎸囦護鐨勫湴鍧,鐩戣鍒扮殑鏄嚱鏁板湴鍧.
涓ゆ潯鎸囦護绱ф尐鐫鎵ц錛屼竴鑸緭鍑虹殑閮芥槸璺寵漿琛ㄧ殑鍦板潃錛岃屼笉鏄嚱鏁扮殑緇濆鍦板潃
浠ヤ笅鏄疺S涓嬫柇鐐瑰悗錛岃皟璇?紿楀彛/鍙嶆眹緙?鏄劇ず鐨勬眹緙栦唬鐮侊細
……
;璺寵漿琛細 錛堟湰琛屾槸鏈漢鍔犵殑錛?br>std::locale::id::operator unsigned int:
00434F50 jmp std::locale::id::operator unsigned int (43D8F0h)
gf:
00434F55 jmp gf (4377C0h)
DName::isValid:
00434F5A jmp DName::isValid (4845D0h)
……
void gf(){ cout<<"::gf()"; }
004377C0 push ebp
004377C1 mov ebp,esp
……
gf();
0043783E call gf (434F55h)
F f=gf;
00437843 mov dword ptr [f],offset gf (434F55h)
……
system("pause");
0043785B push offset string "pause" (4A2098h)
00437860 call @ILT+2850(_system) (434B27h)
00437865 add esp,4
……
#include<iostream>
using namespace std;
class A{
public:
int i;
char c;
void f(){cout<<"A::f()"<<endl;}
virtual void vf(){cout<<"A::vf()"<<endl;}
A():i(11){}
}a;
class B{
public:
void f(){cout<<"B::f()"<<endl;}
virtual void vf(){cout<<"B::vf()"<<endl;}
int c;
int i;
B():i(22),c(66){}
}b;
int main(){
A *pA=(A*)&b;
pA->f();/*緙栬瘧鏃跺氨鍐沖畾浜嗚皟鐢ˋ::f()銆傚洜涓轟笉鏄櫄鍑芥暟錛屼笉瀛樺湪"榪愯鏃跺喅瀹氱被鍨?銆?nbsp;
(鎵璋撹繍琛屾椂鍐沖畾綾誨瀷錛屽叾瀹炲氨鏄湪璋冪敤铏氬嚱鏁版椂錛屽皢鏍規嵁瀵硅薄鐨勫唴瀛樺湴鍧鏉ュ亸縐伙紝鎵懼埌铏氬嚱鏁拌〃銆傘傘?
綾葷殑闈炶櫄鎴愬憳鍑芥暟鍏跺疄鏄叏灞鍑芥暟錛堝洜姝わ紝灝卞瓨鍌ㄧ┖闂磋岃█錛屽畠”涓嶅睘浜?#8220;綾伙級錛岃皟鐢ㄦ椂鏍規嵁闅?br> 鍚寚閽坱his鏉ュ喅瀹氳皟鐢ㄥ摢涓紝鍏跺疄灝辨槸鍏ㄥ眬鐨勯噸杞藉嚱鏁扳斺旀牴鎹艦鍙傚喅瀹氳皟鐢ㄧ増鏈?nbsp;
榪欓噷浼犻掔殑鏄疉綾繪寚閽堬紝褰撶劧璋冪敤鐨勬槸void f(A* this) 榪欎釜鐗堟湰銆?nbsp;
鍥犳錛岀紪璇戞椂灝辯‘瀹氫簡璋冪敤鐨勫摢涓嚱鏁般?nbsp;
涓轟粈涔堜笉鍦ㄨ繍琛屾椂鍐沖畾錛熷洜涓哄畠”涓嶅睘浜?#8220;綾伙紝瀹冩槸鍏ㄥ眬鐨勶紝涓嶅彲鑳芥牴鎹被瀵硅薄鍦板潃鏉ュ亸縐繪潵瀵誨潃銆?
*/
cout<<pA->i<<endl;/*緙栬瘧鏃惰涓哄皢杈撳嚭A::i,浣嗘槸榪愯鏃舵牴鎹被瀵硅薄瀵誨潃綾繪垚鍛樺彉閲忥紝
杈撳嚭鐨勫叾瀹炴槸:int(b瀵硅薄鐨勫湴鍧 錛?a瀵硅薄涓璱鐩稿浜?amp;a鐨勫亸縐?銆?br> 涓轟粈涔堣鍦ㄨ繍琛屾椂鍐沖畾錛熷洜涓哄畠鏄?#8220;灞炰簬”綾葷殑錛岃鏍規嵁綾誨璞$殑鍦板潃鏉ュ亸縐誨鍧銆?br>
cout<<pA->b<<endl;緙栬瘧鏃惰涓哄皢杈撳嚭A::b,鎵浠ョ紪璇戝嚭閿欙細"class A has no member named 'b'
*/
pA->vf();/*榪愯鏃跺喅瀹氥?
浠栨槸鎬庝箞鍋氬埌榪愯鏃跺喅瀹氱殑鍛紵欖旀湳錛岃絀夸簡錛屾墍璋?#8220;榪愯鏃跺姩鎬佺被鍨?#8221;鏍規湰灝辨槸涓涓殰鐪兼硶銆?br> 緙栬瘧鏃訛紝璋冪敤浠涔堝茍涓嶇煡閬擄紝鍙煡閬撹皟鐢ㄧ殑鏄竴涓櫄鍑芥暟錛屽洜姝わ紝鏍規嵁鎸囬拡鎸囧悜鐨勫璞♀斺攂鏉ュ鍧錛岋紙鍏跺疄錛屾鍒誨畠浠嶇劧鎶妏A鎸囧悜鐨刡褰撲綔A綾誨璞★紝浣嗘槸鍚屼竴涓紪璇戝櫒涓嬭櫄琛ㄧ浉瀵逛簬瀵硅薄璧峰鍦板潃鐨勫亸縐繪槸緙栬瘧鍣ㄥ凡緇忕‘瀹氫簡鐨勩傦級鎵懼埌铏氬嚱鏁拌〃鍦板潃錛堣櫄琛ㄦ槸鍦ㄧ被鍐呴儴鐨勶級錛岀劧鍚庢牴鎹櫄琛ㄦ壘鍒拌櫄鍑芥暟鍦板潃銆?/font>
鍥犳錛?#8220;榪愯鏃跺喅瀹?#8221;鐨勭珛瓚崇偣鏄櫄鍑芥暟銆?
*/
cout<<"\n------------------>"<<endl;
cout<<sizeof b<<" "<<sizeof a<<endl; /*VC涓紝綾誨璞″悇鎴愬憳鐨勫瓨鍌ㄩ『搴忎緷嬈′負錛氳櫄琛紙濡傛灉鏈夊垯錛?瀛楄妭錛岄潪闈欐佹垚鍛樺彉閲忔寜澹版槑欏哄簭渚濇錛堥粯璁?瀛楄妭瀵歸綈錛夈?br> 闈欐佹垚鍛樺拰鎴愬憳鍑芥暟閮戒笉鍦ㄧ被瀵硅薄鐨?#8220;鍐呴儴”*/
cout<<int(* ((char*)&b+4) )<<endl;
cout<<int(* ((char*)&b+8) )<<endl;
typedef void(*F)();
F ff= (F)*( (int*)*(int*)&b +0 ) ;
ff();
cout<<"<------------------\n"<<endl;
system("pause");
}