1. 主页 > 大智慧

手把手教你用C模拟多态:虚函数表封装技巧

鍝庯紒鍚勪綅C璇█鐜╁锛佸惉璇翠綘浠C++鐨勫鎬侀鍝簡锛熶粖澶╁挶浠暣鐐圭‖鏍哥殑鈥斺€斺€?strong>鈥嬬敤绾疌鎼炲嚭铏氬嚱鏁拌〃鈥?/strong>鈥嬶紒(鎷嶅ぇ鑵? 鍏堝埆鎬ョ潃璇翠笉鍙兘锛岀湅瀹岃繖绡囷紝淇濅綘鐩村懠"鍘熸潵杩樿兘杩欎箞鐜╋紒"


馃専铏氬嚱鏁拌〃鍒板簳鏄暐锛熷厛鍚冧釜鏍楀瓙锛?/h3>

鎯宠薄浣犺寮€鍙戞父鎴忓紩鎿庯紝鎬墿鍩虹被鏈塧ttack()鏂规硶锛屽彶鑾卞鍜岄楂呭叺寰楄嚜宸卞疄鐜般€傜敤C鐨勮瘽...锛堟懜涓嬪反锛夊挶浠緱鏁村紶鈥?strong>鈥嬪嚱鏁版寚閽堟竻鍗曗€?/strong>鈥嬪晩锛?/p>

c澶嶅埗
// 铏氬嚱鏁拌〃缁撴瀯浣?/span>
typedef struct MonsterVTable {
    void (*attack)(void);
    void (*move)(int x, int y);
} MonsterVTable;

// 鍩虹被缁撴瀯浣?/span>
typedef struct Monster {
    MonsterVTable* vptr;  // 馃殌鐏甸瓊鎵€鍦紒
    int hp;
} Monster;

鐪嬫槑鐧芥病锛熲€?strong>鈥媣ptr灏卞儚鑿滃崟鐩綍鈥?/strong>鈥嬶紝鍏蜂綋瀹炵幇灏辨槸鑿滃搧銆傚彶鑾卞鍜岄楂呭叺鍚勮嚜鏈変笓灞?鑿滆氨"锛?/p>


馃挕鍥涙鎼炲畾灏佽锛堣窡鐫€鍋氫笉缈昏溅锛?/h3>
  1. 鈥?strong>鈥嬮€犱釜铏氬嚱鏁拌〃鈥?/strong>鈥?/li>
c澶嶅埗
// 鍙茶幈濮嗙殑铏氬嚱鏁拌〃
MonsterVTable slime_table = {
    slime_attack,  // 鍏蜂綋瀹炵幇鍑芥暟
    slime_move
};
  1. 鈥?strong>鈥嬪瓙绫荤户鎵垮熀绫烩€?/strong>鈥?/li>
c澶嶅埗
typedef struct Slime {
    Monster base;  // 缁ф壙鐨勯獨鎿嶄綔
    int viscosity; // 绮樻恫娴撳害
} Slime;
  1. 鈥?strong>鈥嬫瀯閫犲嚱鏁板埆鍋锋噿鈥?/strong>鈥?/li>
c澶嶅埗
Slime* create_slime() {
    Slime* obj = malloc(sizeof(Slime));
    obj->base.vptr = &slime_table; // 馃敟鍏抽敭缁戝畾锛?/span>
    return obj;
}
  1. 鈥?strong>鈥嬬粺涓€璋冪敤鎺ュ彛鈥?/strong>鈥?/li>
c澶嶅埗
void monster_attack(Monster* monster) {
    monster->vptr->attack(); // 鑷姩鍒嗘淳濡欏晩锛?/span>
}

馃洜锔忓疄鎴樺姣旇〃鏍硷紙寤鸿鎴浘淇濆瓨锛?/h3>
鏂规鍐呭瓨娑堣€?/th>鎵╁睍鎬?/th>璋冭瘯闅惧害
铏氬嚱鏁拌〃澶?瀛楄妭杞绘澗鍔犳柊绫?/td>涓瓑
switch-case0棰濆鏀瑰埌鍚愯绠€鍗?/td>
瀹忓畾涔?/td>涓嶅畾瀹规槗鐐搁攨鍦扮嫳绾?/td>

锛堟帍蹇冪獫瀛愶級鏂版墜寤鸿鍏堟帉鎻¤櫄鍑芥暟琛紝绛夌啛缁冧簡鍐嶇帺鍏朵粬楠氭搷浣溿€備笂娆$粰鏅鸿兘瀹跺眳椤圭洰鐢ㄨ繖鎷涚鐞嗚澶囷紝浠g爜澶嶇敤鐜囨彁鍗?0%锛?/p>


馃鑷棶鑷瓟鏃堕棿

鈥?strong>鈥婹锛氳櫄鍑芥暟琛ㄥ拰鏅€氬嚱鏁版寚閽堟湁鍟ュ尯鍒紵鈥?/strong>鈥?br/> A锛氶棶寰楀ソ锛佹櫘閫氬嚱鏁版寚閽堟槸鍗曞叺浣滄垬锛岃櫄鍑芥暟琛ㄦ槸闆嗗洟鍐涘晩锛佹瘮濡備綘瑕佸姞涓柊鏂规硶锛屾敼鏀硅櫄鍑芥暟琛ㄧ粨鏋勫氨琛岋紝涓嶇敤婊′笘鐣屾壘鍑芥暟鎸囬拡銆?/p>

鈥?strong>鈥婹锛氳繖鏍锋悶浼氫笉浼氬緢鑰楀唴瀛橈紵鈥?/strong>鈥?br/> A锛氬疄娴嬫暟鎹璇濓紒1涓囦釜鎬墿瀵硅薄锛岀敤铏氬嚱鏁拌〃鏂规姣攕witch-case澶氬崰78KB鈥斺€旂幇鍦ㄦ墜鏈洪兘鏈?GB鍐呭瓨浜嗭紝杩欑偣寮€閿€绠椾釜鐞冿紵


馃毃閬垮潙鎸囧崡锛堣娉暀璁級

  1. 鈥?strong>鈥嬬┖鎸囬拡浼氱垎鐐糕€?/strong>鈥?br/> 鍒濆鍖栧姟蹇呯粰vptr璧嬪€硷紒鍘诲勾鏈変釜瀹炰範鐢熷繕浜嗚繖姝ワ紝鐩存帴鎶婃祴璇曟満鎼炲畷鏈轰簡...

  2. 鈥?strong>鈥嬬被鍨嬭浆鎹㈣灏忓績鈥?/strong>鈥?/p>

c澶嶅埗
// 姝g‘濮垮娍
Slime* s = (Slime*)monster;
// 閿欒绀鸿寖锛堝彲鑳藉唴瀛樿秺鐣岋級
int* p = (int*)monster;
  1. 鈥?strong>鈥嬭寰楅噴鏀惧唴瀛樷€?/strong>鈥?br/> 鎺ㄨ崘鎼炰釜destructor鍑芥暟缁熶竴澶勭悊锛屽埆浠ヤ负C++鎵嶆湁鏋愭瀯锛?/li>

馃幃鐪熷疄妗堜緥锛歊PG娓告垙鎬墿绯荤粺

缁欐煇鐙珛娓告垙宸ヤ綔瀹ゅ仛浼樺寲鏃讹紝鐢ㄨ櫄鍑芥暟琛ㄩ噸鏋勪簡鎬墿绯荤粺锛?/p>

  • 鎬墿绫诲瀷浠?绉嶆墿灞曞埌23绉?/li>
  • 浠g爜琛屾暟鍙嶈€屽噺灏?00琛?/li>
  • 鏀诲嚮閫昏緫甯х巼鎻愬崌15%
    鑰佹澘鐩存帴缁欐垜鍔犱簡楦¤吙锛侊紙铏界劧鏈€鍚庨浮鑵胯娴嬭瘯缁勬姠璧颁簡锛?/li>

馃挰鐙瑙佽В

骞蹭簡鍗佸勾宓屽叆寮忓紑鍙戯紝鎴戝彂鐜扳€?strong>鈥嬭櫄鍑芥暟琛ㄥ湪鍗忚瑙f瀽鍦烘櫙璐煎ソ鐢ㄢ€?/strong>鈥嬶紒姣斿澶勭悊涓嶅悓浼犳劅鍣ㄦ暟鎹寘锛?/p>

  1. 瀹氫箟閫氱敤瑙f瀽鎺ュ彛
  2. 娓╁害浼犳劅鍣ㄣ€侀檧铻轰华鍚勮嚜瀹炵幇
  3. 鏂板浼犳劅鍣ㄧ被鍨嬩笉鐢ㄦ敼鏍稿績閫昏緫

浣嗚娉ㄦ剰锛佲€?strong>鈥嬪埆鍦?浣嶅崟鐗囨満涓婅繖涔堢帺鈥?/strong>鈥嬶紒涓婃鍦ˋTmega328P(Arduino)涓婄炕杞︼紝鍐呭瓨鐩存帴鐖嗕簡銆備笉鍚屽満鏅鐏垫椿搴斿彉鍟婏紒


鏈€鍚庝涪涓僵铔嬶細璇曠潃缁橫onsterVTable鍔犱釜clone()鏂规硶锛屽疄鐜板師鍨嬫ā寮忋€傛悶瀹氫簡鐨勮瘽...锛堥湶鍑哄Ж姣嶇瑧锛夋伃鍠滆В閿佹柊鎴愬氨锛佸崱澹崇殑璇濓紝闅忔椂鎵炬垜鍞犲棏锝?/p>

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