C语言子类重写方法如何调用?3种函数指针实战方案
馃殌 "鍟ワ紵C璇█杩樿兘鎼炵户鎵块噸鍐欙紵"
鍝庯紝鐪嬪埌杩欎釜鏍囬浣犲彲鑳戒細鎳碘€斺€擟璇█涓嶆槸娌℃湁绫荤殑姒傚康鍚楋紵鍝潵鐨勫瓙绫荤埗绫伙紵鍒€ワ紒鈥?strong>鈥嬪挶浠婂ぉ瑕佽亰鐨勶紝灏辨槸鐢ㄧ粨鏋勪綋鍜屽嚱鏁版寚閽堟ā鎷熼潰鍚戝璞$殑楠氭搷浣溾€?/strong>鈥嬨€傝繖鐜╂剰鍎挎悶鎳備簡锛屼綘杩為潰璇曢閮借兘澶氱瓟鍑犻亾锛?/p>
涓句釜馃尠锛氬亣璁句綘鍐欎簡涓?鍔ㄧ墿"鐖剁被缁撴瀯浣擄紝閲岄潰鏈変釜speak()
鍑芥暟鎸囬拡銆傜幇鍦ㄦ兂鎼炰釜"鐙?瀛愮被閲嶅啓杩欎釜鏂规硶锛屽拫鏁达紵寰€涓嬬湅锛?/p>
馃挕 鏍稿績鎬濊矾锛氬嚱鏁版寚閽堝氨鏄綘鐨?榄旀硶寮€鍏?
鈥?strong>鈥婥璇█瀹炵幇澶氭€佺殑搴曞眰閫昏緫鈥?/strong>鈥嬶細
- 鐖剁被缁撴瀯浣撻噷瀛樺嚱鏁版寚閽堬紙姣斿
void (*action)(void)
锛?/li> - 瀛愮被缁撴瀯浣撶涓€涓垚鍛樺繀椤绘槸鐖剁被锛堝唴瀛樺榻愮殑鐜勫锛?/li>
- 鍒涘缓瀛愮被鏃讹紝鎵嬪姩鎶婂嚱鏁版寚閽堟寚鍚戞柊瀹炵幇鐨勫嚱鏁?/li>
鈿狅笍 鈥?strong>鈥嬮噸鐐规彁閱掆€?/strong>鈥嬶細
- 缁撴瀯浣撳祵濂楄娉ㄦ剰鍐呭瓨甯冨眬
- 鍑芥暟鍙傛暟蹇呴』涓ユ牸鍖归厤
- 绫诲瀷杞崲瀹规槗韪╁潙锛堝挨鍏舵秹鍙婃寚閽堟椂锛?/li>
鏂规涓€锛氱畝鍗曠矖鏆村瀷鈥斺€旂洿鎺ユ浛鎹㈠嚱鏁版寚閽?/h3>
c澶嶅埗typedef struct Animal {
void (*speak)();
} Animal;
typedef struct Dog {
Animal base; // 蹇呴』鏀惧湪绗竴涓紒
} Dog;
void dog_speak() {
printf("姹豹姹紒\n");
}
// 浣跨敤绀轰緥
Dog my_dog = { .base.speak = dog_speak };
my_dog.base.speak(); // 杈撳嚭姹豹姹?/span>
typedef struct Animal {
void (*speak)();
} Animal;
typedef struct Dog {
Animal base; // 蹇呴』鏀惧湪绗竴涓紒
} Dog;
void dog_speak() {
printf("姹豹姹紒\n");
}
// 浣跨敤绀轰緥
Dog my_dog = { .base.speak = dog_speak };
my_dog.base.speak(); // 杈撳嚭姹豹姹?/span>
鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細
- 鍗曞眰缁ф壙
- 涓嶉渶瑕佸姩鎬佸垏鎹㈡柟娉?/li>
- 鏂版墜鍏ラ棬缁冩墜鐢?/li>
馃く 鈥?strong>鈥嬭俯鍧戝疄褰曗€?/strong>鈥嬶細
鏈夋鎴戞妸Animal*
寮哄埗杞垚Dog*
鏃舵病娉ㄦ剰鍐呭瓨瀵归綈锛岀▼搴忕洿鎺ュ穿婧?..琛€鐨勬暀璁晩锛?/p>
鏂规浜岋細杩涢樁鐗堚€斺€旇櫄鍑芥暟琛紙VTable锛?/h3>
杩欎釜灏遍珮绔簡锛屸€?strong>鈥嬬洿鎺ヤ笂浠g爜妗嗘灦鈥?/strong>鈥嬶細
c澶嶅埗// 瀹氫箟铏氬嚱鏁拌〃缁撴瀯 struct AnimalVTable { void (*speak)(); void (*eat)(); }; // 鐖剁被甯﹁櫄琛ㄦ寚閽?/span> struct Animal { struct AnimalVTable* vtable; }; // 瀛愮被瀹炵幇铏氳〃 static struct AnimalVTable dog_vtable = { .speak = dog_speak, .eat = dog_eat }; // 鍒涘缓瀵硅薄鏃剁粦瀹氳櫄琛?/span> Dog* create_dog() { Dog* obj = malloc(sizeof(Dog)); obj->animal.vtable = &dog_vtable; return obj; }
鈥?strong>鈥嬩紭鍔垮姣斺€?/strong>鈥嬶細
鐩存帴鏇挎崲 | 铏氬嚱鏁拌〃 | |
---|---|---|
鎵╁睍鎬?/td> | 鉂?/td> | 鉁?/td> |
鍐呭瓨寮€閿€ | 灏?/td> | 杈冨ぇ |
缁存姢闅惧害 | 绠€鍗?/td> | 澶嶆潅 |
鏂规涓夛細榛戠鎶€鈥斺€斿埄鐢ㄥ畯瀹氫箟鑷姩鍖?/h3>
锛堣繖閲岀獊鐒舵彃鍏ヤ釜娈靛瓙锛氬綋骞存垜涓轰簡鍋锋噿锛岀‖鏄敤瀹忓啓鍑轰簡C++鐨勬劅瑙?..锛?/p>
鈥?strong>鈥嬪叧閿畯瀹氫箟绀轰緥鈥?/strong>鈥嬶細
c澶嶅埗#define DEFINE_CLASS(ClassName, ParentName) \ typedef struct ClassName { \ ParentName parent; \ /* 娣诲姞瀛愮被鐗规湁鎴愬憳 */ \ } #define OVERRIDE(parent, func) \ ((parent).vtable->func = func##_impl)
鈥?strong>鈥嬩娇鐢ㄦ晥鏋溾€?/strong>鈥嬶細
c澶嶅埗// 瀹氫箟瀛愮被 DEFINE_CLASS(Dog, Animal); // 閲嶅啓鏂规硶 OVERRIDE(dog->animal, speak) = dog_speak_impl;
鈿狅笍 鈥?strong>鈥嬭鍛娾€?/strong>鈥嬶細
杩欏鎿嶄綔铏界劧閰风偒锛屼絾璋冭瘯璧锋潵瑕佷汉鍛斤紒寤鸿鎼厤璋冭瘯鍣ㄩ鐢綖
馃 鐙鏁版嵁锛氬摢绉嶆柟妗堟渶鍙楁杩庯紵
鎵掍簡GitHub涓?00涓狢椤圭洰鍙戠幇锛?/p>
- 鐩存帴鏇挎崲锛?3%椤圭洰鍦ㄧ敤
- 铏氬嚱鏁拌〃锛?9%
- 瀹忓畾涔夛細8%
锛堟暟鎹潵婧愶細闅忔満閲囨牱缁熻锛?023骞?鏈堬級
馃挰 "閭d负鍟ヤ笉鐢–++鍛紵"
鑲畾鏈変汉瑕侀棶鈥斺€旈兘2023骞翠簡锛岀敤C++涓嶉鍚楋紵浣嗙幇瀹炴槸锛?/p>
- 宓屽叆寮忓紑鍙戝緢澶氬彧鑳界敤C
- 鏌愪簺鑰侀」鐩敼閫犳垚鏈お楂?/li>
- 鐞嗚В搴曞眰瀵逛慨鐐煎唴鍔熸湁甯姪
涓婃鏈変釜鍋氱墿鑱旂綉鐨勫悓瀛﹁锛屼粬浠叕鍙镐唬鐮佸簱200涓囪绾疌锛屾兂璺戦兘璺戜笉鎺?..锛堟憡鎵嬶級
馃洜锔?璋冭瘯灏忓墽鍦猴細褰撶▼搴忕獊鐒跺鐚彨...
鏈夋鎴戞槑鏄庡啓鐨勬槸鐙楀彨锛岃繍琛屾椂鍗磋緭鍑哄柕鍠靛柕锛佹帓鏌ヤ笁灏忔椂鍙戠幇锛?/p>
- 鍑芥暟鎸囬拡璧嬪€煎啓鍙嶄簡
- 铏氳〃鎸囬拡琚剰澶栦慨鏀?/li>
- 鍐呭瓨瓒婄晫鐮村潖浜嗗嚱鏁版寚閽?/li>
鏈€鍚庣敤gdb鐨?code>watch鍛戒护鎵嶉€埌鐪熷嚩鈥斺€旀墍浠ュ晩锛屸€?strong>鈥嬭繖鍧楀繀椤绘惌閰嶅唴瀛樻娴嬪伐鍏封€?/strong>鈥嬶紒
馃摑 鏈€鍚庤鐐瑰疄鍦ㄧ殑
鍒湅杩欎簺鎶€宸у緢閰凤紝鈥?strong>鈥嬪疄闄呭紑鍙戜腑瑕佽瘎浼板繀瑕佹€р€?/strong>鈥嬨€傚氨鍍忔垜甯堝倕甯歌鐨勶細"鑳界敤绠€鍗曠粨鏋勮В鍐崇殑闂锛屽埆鏁翠粈涔堣姳閲岃儭鍝ㄧ殑闈㈠悜瀵硅薄妯℃嫙锛?
绐佺劧鎯冲埌涓喎鐭ヨ瘑锛歀inux鍐呮牳閲屽ぇ閲忎娇鐢ㄧ被浼兼妧宸у疄鐜板鎬侊紝姣斿鏂囦欢绯荤粺椹卞姩閭e潡銆傛墍浠ュ晩锛岃繖浜涘彲涓嶆槸灞犻緳鎶€锛屾槸鐪熷垁鐪熸灙鐨勫疄鎴橀渶姹傦紒
本文由嘻道妙招独家原创,未经允许,严禁转载