小白学SEO,就到冬镜SEO博客网,记住官方永久地址 uqseo.com

搜你想搜,想你“”想

C++ 涓芥颁ㄦ涔锛浣ラ搴璇ユ敞涔锛

原创C璇Plus

【摘要】C++涓芥扮浣ㄤ富瑕浜澶哄躲充锛绠瑷涔灏辨ㄧ剁被跺绫荤瀹渚锛跺杩剁被璋ㄥ瀛绫荤芥般...

C++涓芥扮浣ㄤ富瑕浜澶哄躲充锛绠瑷涔灏辨ㄧ剁被跺绫荤瀹渚锛跺杩剁被璋ㄥ瀛绫荤芥般杩绉浠ヨ剁被澶绉褰㈡锛杩绉娉璋娉璇寸戒灏辨句娇ㄤ浠gュ绠娉姣濡锛妯℃挎RTTI芥版瑕涔惧板ㄧ璇跺宠锛瑕涔璇惧拌琛跺宠

充芥扮浣跨ㄦ规锛ㄨ涓杩澶杩般澶у浠ョ稿崇C++涔ㄨ绡绔涓充芥扮瀹哄朵负澶у 涓涓扮

褰讹稿绔ㄧ涓涔虹杩涓浜浜锛浣绘瑙杩浜绔涓瀹规璇伙澶ф澶ф浠g锛娌℃剧锛娌℃璇璇存娌℃姣杈锛娌℃涓句涓涓╀涔璇伙浠ヨ冲涓杩绡绔涔甯澶у澶缁

瑷褰姝d锛璁╂浠璧疯ヨ芥扮涓

芥拌〃

瀵C++ 浜瑙g浜洪藉璇ョラ芥帮Virtual Function锛杩涓寮芥拌〃锛Virtual Table锛ュ绠绉颁负V-Table ㄨ涓〃涓涓绘涓涓被芥扮板琛杩寮琛ㄨВ充缁ф裤瑕锛淇璇跺瀹搴瀹芥般杩凤ㄦ芥扮绫荤瀹渚涓涓〃琚ㄤ 杩涓渚瀛涓浠ワ褰浠ㄧ剁被ユ浣涓涓绫荤跺锛杩寮芥拌〃灏辨惧变负瑕浜锛瀹灏卞涓板句凤瀹搴璇ヨㄧ芥般

杩浠涓涓杩寮芥拌〃C++瑙艰功涓帮缂璇ㄥ瑕淇璇芥拌〃瀛ㄤ璞″渚涓㈢浣缃杩负浜淇璇姝g‘拌芥扮Щ 杩崇浠杩瀵硅薄瀹渚板寰拌寮芥拌〃锛跺氨浠ラ朵腑芥版锛骞惰ㄧ稿芥般

d澶锛浠ユ瑙烘ヤㄥ芥浠ュ村澶磋浆浜 娌″崇郴锛涓㈠氨渚瀛锛镐俊浣涓灏辨戒

璁炬浠杩风涓涓被锛

classBase{

public:

virtual voidf(){cout << "Base::f" << endl;}

virtual voidg(){cout << "Base::g" << endl;}

virtual voidh(){cout << "Base::h" << endl;}

};

т㈢璇存锛浠浠ラ杩Base瀹渚ュ拌芥拌〃 涓㈡渚绋锛

typedefvoid(*Fun)(void);

Baseb;

Fun pFun = NULL;

cout << "芥拌〃板锛" << (int*)(&b) << endl;

cout << "芥拌〃 绗涓芥板板锛" << (int*)*(int*)(&b) << endl;

璁や负(int*)(&b)琛ㄧ板锛寰澶缃借锛锛涔璁や负锛锛(int *)*(int*)(&b)琛ㄥ板

(int*)*((int*)*(int*)(&b)); 琛ㄧ涓涓芥扮板

跺㈢璋pFun = (Fun)*((int*)*(int*)(&b)); 灏卞浠ョ猴*((int*)*(int*)(&b));杞芥版缁pFun锛跺纭璋ㄥ颁芥virtual void f()

// Invoke the first virtual function

pFun = (Fun)*((int*)*(int*)(&b));

pFun();

瀹杩琛缁濡涓锛(Windows XP+VS2003, Linux 2.6.22 + GCC 4.1.3)

芥拌〃板锛0012FED4

芥拌〃 绗涓芥板板锛0044F148

Base::f

杩杩涓ず渚锛浠浠ョ帮浠浠ラ杩寮鸿&b杞int *锛寰芥拌〃板锛跺娆″灏卞浠ュ扮涓涓芥扮板浜锛涔灏辨Base::f()锛杩ㄤ㈢绋搴腑寰颁楠璇锛int* 寮哄惰浆浜芥版锛杩杩涓ず渚锛浠氨浠ョラ濡瑕璋Base::g()Base::h()锛朵唬濡涓锛

(Fun)*((int*)*(int*)(&b)+0);// Base::f()

(Fun)*((int*)*(int*)(&b)+1);// Base::g()

(Fun)*((int*)*(int*)(&b)+2);// Base::h()

杩涓跺浣搴璇ユ浜с浠涔锛杩规涔杩风浠g澶贡浜娌¢锛璁╂讳釜捐В涓涓濡涓绀猴

娉ㄦㄤ㈣涓句腑锛ㄨ芥拌〃浜涓涓癸杩芥拌〃缁缁癸灏卞绗覆缁绗/0涓凤舵蹇浜芥拌〃缁杩涓蹇煎ㄤ缂璇ㄤWinXP+VS2003涓锛杩涓兼NULLUbuntu 7.10 + Linux 2.6.22 + GCC 4.1.3涓锛杩涓兼1锛琛ㄧず杩涓涓涓芥拌〃锛濡兼0锛琛ㄧず涓芥拌〃

涓灏瑕瑕剁芥拌〃峰娌℃瑕剁被芥版涔浠ヨ璁茶堪娌℃瑕碉涓昏负浜缁涓涓姣ㄦ杈涔涓锛浠浠ユ村娓妤扮ラ跺ㄧ蜂瀹

宠存繁ュ涔浠ュ涓繁寤虹C/C++瀛浜ゆ缇231662552锛娆㈣娆C/C++浣澶х灏ュ涔浜ゆ锛姣ぉ涓缇ら浼澶т浆存涓椤圭瀛锛存绉椤圭渚渚浣繁瀛

涓户匡芥拌锛

涓璁╂浠ョ缁ф挎剁芥拌〃涔风璁炬濡涓绀虹涓涓户垮崇郴锛

璇锋敞ㄨ涓户垮崇郴涓瀛绫绘病杞戒换浣剁被芥般

瀵逛渚锛Derive d; 芥拌〃濡涓锛

浠浠ョ颁㈠癸

1锛芥版у跺0『搴句〃涓

2锛剁被芥板ㄥ绫荤芥板

镐俊浣涓瀹浠ュ㈢d釜绋搴ョ涓娈电搴ラ璇

涓户匡芥拌锛

瑕剁被芥版剧剁浜锛涓讹芥板氨寰姣涓浠ョ涓涓锛濡瀛绫讳腑芥伴杞戒剁被芥帮浼涓涔峰锛璁撅浠涓㈣风涓涓户垮崇郴

涓轰璁╁ぇ瀹剁拌缁ф胯锛ㄨ涓被璁捐涓瑕浜剁被涓涓芥帮f()d锛瀵逛淳绫荤瀹渚锛惰芥拌〃浼㈢涓涓峰锛

浠〃涓浠ョ颁㈠癸

1锛瑕f()芥拌惧颁琛ㄤ腑ョ剁被芥扮浣缃

2锛娌℃琚芥颁с

杩凤浠氨浠ョ板浜㈣风绋搴

Base *b = newDerive();

b->f();

b瀛涓芥拌〃f()浣缃凡缁Derive::f()芥板板浠o浜ㄥ璋ㄥ讹Derive::f()琚ㄤ杩灏卞浜澶

澶缁ф匡芥拌锛

涓璁╂浠ョ澶缁ф夸腑碉璁炬涓㈣蜂涓被缁ф垮崇郴娉ㄦ瀛绫诲苟娌℃瑕剁被芥般

瀵逛绫诲渚涓芥拌〃锛㈣涓峰锛

浠浠ョ帮

1锛 姣釜剁被芥繁琛ㄣ

2锛 瀛绫荤芥拌惧颁绗涓剁被琛ㄤ腑锛璋绗涓剁被у0『搴ュゆ锛

杩峰灏辨负浜瑙e充剁被绫诲涓涓绫诲渚锛藉璋ㄥ板芥般

澶缁ф匡芥拌锛

涓㈡浠ョ锛濡芥拌点

涓句腑锛浠ㄥ绫讳腑瑕浜剁被f()芥般

涓㈡浜绫诲渚涓芥拌〃撅

浠浠ョ瑙锛涓涓剁被芥拌〃涓f()浣缃挎㈡浜瀛绫荤芥版杩凤浠氨浠ヤ换涓绫诲剁被ユ瀛绫伙骞惰ㄥ绫荤f()浜濡锛

Derived;

Base1 *b1 = &d;

Base2 *b2 = &d;

Base3 *b3 = &d;

b1->f();//Derive::f()

b2->f();//Derive::f()

b3->f();//Derive::f()

b1->g();//Base1::g()

b2->g();//Base2::g()

b3->g();//Base3::g()

瀹ㄦ

姣C++绔锛诲涓浜瑕瑰や涓C++杩绡绔涔涓渚澶杩涓㈢璁茶堪锛镐俊浠芥拌〃涓涓杈缁寸浜瑙d姘村杞借锛浜瑕涓璁╂浠ョ浠浠ョㄨ芥拌〃ュ共逛涔с

涓杩剁被璁块绫昏繁芥

浠ラ锛瀛绫绘病杞界剁被芥版浠舵浜涓哄涔轰芥伴杞界界跺ㄤ㈢句腑浠浠ョBase1琛ㄤ腑Derive芥帮浣浠规戒娇ㄤ㈢璇ヨㄥ绫荤芥帮

Base1 *b1 = newDerive();

b1->f1();//缂璇洪

浠讳濡句娇ㄧ剁被宠ㄥ绫讳腑剁被芥扮琛涓洪戒琚璇ㄨ涓洪娉锛浠ワ杩风绋搴规娉缂璇杩浣ㄨ琛讹浠浠ラ杩瑰芥拌〃ヨ揪拌C++璇琛涓恒锛充归㈢灏璇锛杩璇诲㈤褰浠g锛镐俊浣浠ュ拌涓癸

浜璁块 non-public 芥

澶锛濡剁被芥版privateprotected锛浣杩浜public芥板蜂瀛ㄤ芥拌〃涓浠ワ浠峰浠ヤ娇ㄨ芥拌〃瑰ヨ浜non-public芥帮杩瀹规扮

濡锛

classBase{

private:

virtual voidf(){cout << "Base::f" << endl;}

};

classDerive : publicBase{

};

typedefvoid(*Fun)(void);

voidmain(){

Derived;

Fun pFun = (Fun)*((int*)*(int*)(&d)+0);

pFun();

}

锛 1 锛virtual 芥

涓娈电浠g锛

Code Segment:

#include<stdio.h>

classBase{

public:

virtual void__stdcall Output(){

printf("Class Base\n");

}

};

classDerive :publicBase{

public:

void__stdcall Output(){

printf("Class Derive\n");

}

};

voidTest(Base *p){

p->Output();

}

int__cdecl main(intargc,char* argv[]){

Derive obj;

Test(&obj);

return0;

}

虹被Output芥版釜芥般d锛寰惧帮绋搴杩琛缁灏

( 2) virtual function table 芥拌〃

ュ浠main芥颁腑Derive绫荤瀵硅薄obj锛瀹瀛甯灞锛变病版锛瀹澶у负4涓锛涓涓vfptr锛浠obj板涔灏辨vfptr板浜

瀵逛涓C++绫伙濡瀹瑕澶锛涓缂璇ㄤ灏杩涓被浠ュ瀹虹被涓virtual抽浣涓鸿涓被澶锛锛d绫讳涓涓virtual function table锛姣涓渚锛瀵硅薄锛戒涓涓virtual function pointer锛浠ヤ绠绉vfptr锛璇ョ被virtual function table璧峰板锛virtual function table琛ㄦ煎板瀵瑰瀛瀹瑰氨芥板板锛跺骞朵姝g芥板板锛烦杞板芥扮jmp浠ょ板锛

( 2 ) 瀹 virtual

缁璇

C++杩ㄨ瑷Magic璇锛瀵逛搴ヨ锛浠技涔案杩镐娓妤杩ㄨ瑷浠ㄥ共浜浠涔瑕杩ㄨ瑷锛浠氨蹇瑕浜瑙C++㈢d涓瑗匡瑕浜瑙C++涓d遍╃涓瑗裤涓讹杩绉捣冲ご歌繁缂绋璇

特别声明

本文为 C璇Plus 原创发布,仅代表作者观点,不代表冬镜品知网的观点或立场,冬镜品知网仅提供信息发布平台,合作供稿、侵权删除、反馈建议请联系 520@520xx.cc

    热门文章推荐

C璇Plus

涓哄ぇ瀹舵渚涓浜C璇c++瀛ヨ.

冬镜品知网,涉及生活、科技、互联网、健康医疗等几十个分类,平台入驻专业机构、专家学者,向读者免费分享优质的文章.