鈥嬪挶浠婂ぉ瑕佽亰鐨勶紝灏辨槸鐢ㄧ粨鏋勪綋鍜屽嚱鏁版寚閽堟ā鎷熼潰鍚戝璞$殑楠氭搷浣溾€?/strong>鈥嬨€傝繖鐜╂剰鍎挎悶鎳備簡锛屼綘杩為?" />
  1. 主页 > 小妙招

C语言子类重写方法如何调用?3种函数指针实战方案


馃殌 "鍟ワ紵C璇█杩樿兘鎼炵户鎵块噸鍐欙紵"

鍝庯紝鐪嬪埌杩欎釜鏍囬浣犲彲鑳戒細鎳碘€斺€擟璇█涓嶆槸娌℃湁绫荤殑姒傚康鍚楋紵鍝潵鐨勫瓙绫荤埗绫伙紵鍒€ワ紒鈥?strong>鈥嬪挶浠婂ぉ瑕佽亰鐨勶紝灏辨槸鐢ㄧ粨鏋勪綋鍜屽嚱鏁版寚閽堟ā鎷熼潰鍚戝璞$殑楠氭搷浣溾€?/strong>鈥嬨€傝繖鐜╂剰鍎挎悶鎳備簡锛屼綘杩為潰璇曢閮借兘澶氱瓟鍑犻亾锛?/p>

涓句釜馃尠锛氬亣璁句綘鍐欎簡涓?鍔ㄧ墿"鐖剁被缁撴瀯浣擄紝閲岄潰鏈変釜speak()鍑芥暟鎸囬拡銆傜幇鍦ㄦ兂鎼炰釜"鐙?瀛愮被閲嶅啓杩欎釜鏂规硶锛屽拫鏁达紵寰€涓嬬湅锛?/p>


馃挕 鏍稿績鎬濊矾锛氬嚱鏁版寚閽堝氨鏄綘鐨?榄旀硶寮€鍏?

鈥?strong>鈥婥璇█瀹炵幇澶氭€佺殑搴曞眰閫昏緫鈥?/strong>鈥嬶細

  1. 鐖剁被缁撴瀯浣撻噷瀛樺嚱鏁版寚閽堬紙姣斿void (*action)(void)锛?/li>
  2. 瀛愮被缁撴瀯浣撶涓€涓垚鍛樺繀椤绘槸鐖剁被锛堝唴瀛樺榻愮殑鐜勫锛?/li>
  3. 鍒涘缓瀛愮被鏃讹紝鎵嬪姩鎶婂嚱鏁版寚閽堟寚鍚戞柊瀹炵幇鐨勫嚱鏁?/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>

鈥?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>

  1. 宓屽叆寮忓紑鍙戝緢澶氬彧鑳界敤C
  2. 鏌愪簺鑰侀」鐩敼閫犳垚鏈お楂?/li>
  3. 鐞嗚В搴曞眰瀵逛慨鐐煎唴鍔熸湁甯姪

涓婃鏈変釜鍋氱墿鑱旂綉鐨勫悓瀛﹁锛屼粬浠叕鍙镐唬鐮佸簱200涓囪绾疌锛屾兂璺戦兘璺戜笉鎺?..锛堟憡鎵嬶級


馃洜锔?璋冭瘯灏忓墽鍦猴細褰撶▼搴忕獊鐒跺鐚彨...

鏈夋鎴戞槑鏄庡啓鐨勬槸鐙楀彨锛岃繍琛屾椂鍗磋緭鍑哄柕鍠靛柕锛佹帓鏌ヤ笁灏忔椂鍙戠幇锛?/p>

  1. 鍑芥暟鎸囬拡璧嬪€煎啓鍙嶄簡
  2. 铏氳〃鎸囬拡琚剰澶栦慨鏀?/li>
  3. 鍐呭瓨瓒婄晫鐮村潖浜嗗嚱鏁版寚閽?/li>

鏈€鍚庣敤gdb鐨?code>watch鍛戒护鎵嶉€埌鐪熷嚩鈥斺€旀墍浠ュ晩锛屸€?strong>鈥嬭繖鍧楀繀椤绘惌閰嶅唴瀛樻娴嬪伐鍏封€?/strong>鈥嬶紒


馃摑 鏈€鍚庤鐐瑰疄鍦ㄧ殑

鍒湅杩欎簺鎶€宸у緢閰凤紝鈥?strong>鈥嬪疄闄呭紑鍙戜腑瑕佽瘎浼板繀瑕佹€р€?/strong>鈥嬨€傚氨鍍忔垜甯堝倕甯歌鐨勶細"鑳界敤绠€鍗曠粨鏋勮В鍐崇殑闂锛屽埆鏁翠粈涔堣姳閲岃儭鍝ㄧ殑闈㈠悜瀵硅薄妯℃嫙锛?

绐佺劧鎯冲埌涓喎鐭ヨ瘑锛歀inux鍐呮牳閲屽ぇ閲忎娇鐢ㄧ被浼兼妧宸у疄鐜板鎬侊紝姣斿鏂囦欢绯荤粺椹卞姩閭e潡銆傛墍浠ュ晩锛岃繖浜涘彲涓嶆槸灞犻緳鎶€锛屾槸鐪熷垁鐪熸灙鐨勫疄鎴橀渶姹傦紒

本文由嘻道妙招独家原创,未经允许,严禁转载