首页 > 投稿 > 正文内容

C语言结构体方法引用指南:3步实现类似面向对象调用

投稿2025-05-28 09:28:49

锛堟摝姹楋級鍚鏈夊皬鐧借C++鐨勯潰鍚戝璞℃暣鑷棴浜嗭紵鍒厡锛佷粖鍎垮挶浠氨鐢ㄧ函C璇█鎼炵偣楠氭搷浣溾€斺€旂敤缁撴瀯浣撳疄鐜版柟娉曡皟鐢紒灏辫窡鏂版墜濡備綍蹇€熸定绮夐渶瑕佹帉鎻℃牳蹇冩妧宸т竴鏍凤紝鍜变滑浠婂ぉ瑕佸鐨勮繖涓獨鎿嶄綔锛岀粷瀵规槸浣犲湪C璇█鍦堣劚棰栬€屽嚭鐨勭瀵嗘鍣ㄣ€?/p>

绗竴姝?閫犱釜"鍋囧璞?

鍝庣瓑绛夛紝鍏堝埆鎬ョ潃鍏抽〉闈紒鎴戣鐨勫亣瀵硅薄鍙笉鏄福鐢烽偅绉嶏紝鏄缁忕殑缁撴瀯浣撳寘瑁呮湳銆傚挶浠厛鏁翠釜鑳藉悆楗殑"浜?锛?/p>

c澶嶅埗
typedef struct {
    char name[20];
    int age;
    // 閲嶇偣鏉ヤ簡馃憞
    void (*eat)(void);  // 鍑芥暟鎸囬拡锛?/span>
} Person;

鐪嬪埌閭d釜void (*eat)(void)娌★紵杩欏氨鏄挶浠伔澶╂崲鏃ョ殑鍏抽敭锛佽窡鎶栭煶闅愯棌鐨勬定绮夌绫嶇被浼硷紝鍑芥暟鎸囬拡灏辨槸缁撴瀯浣撻噷鐨勯殣钘忔妧鑳芥Ы銆?/p>

绗簩姝?缁欐妧鑳芥Ы瑁呮妧鑳?/h3>

鍏夋湁鎶€鑳芥Ы涓嶈鍟婏紝寰楄鍏蜂綋鎶€鑳藉鍚э紵鍜变滑缁檈at鍑芥暟鎸囬拡璧嬪€硷細

c澶嶅埗
void normal_eat() {
    printf("鐢ㄧ瀛愬悆楗璡n");
}

Person xiaoming = {"灏忔槑", 18, normal_eat};

杩欐椂鍊欒皟鐢▁iaoming.eat()锛屽氨浼氭墦鍗?鐢ㄧ瀛愬悆楗?銆傛槸涓嶆槸鏈夌偣閭e懗鍎夸簡锛熷氨璺熺粰鍏紬鍙疯浜嗕釜鑷姩鍥炲鏈哄櫒浜轰技鐨勶紒

绗笁姝?鐜╃偣楂樼骇鐨?/h3>

杩欐椂鍊欒偗瀹氭湁浜鸿闂細閭f垜鎯虫崲绉嶅悆楗柟寮忓拫鏁达紵绠€鍗曪紒鍜变滑鎼炰釜鍑芥暟宸ュ巶锛?/p>

c澶嶅埗
void (*create_eat_func(const char* tool))(void) {
    void new_eat() {
        printf("鐢?s鍚冮キ\n", tool);
    }
    return new_eat;
}

// 浣跨敤妗堜緥
xiaoming.eat = create_eat_func("鍒€鍙?);

锛堟暡榛戞澘锛夋敞鎰忕湅杩欎釜鍑芥暟杩斿洖绫诲瀷锛乿oid (*)(void)琛ㄧず杩斿洖鐨勬槸鍑芥暟鎸囬拡銆傝櫧鐒惰娉曠湅鐫€鍍忎贡鐮侊紝浣嗘晥鏋滄潬鏉犵殑鈥斺€旂幇鍦ㄥ皬鏄庢敼鐢ㄥ垁鍙夊悆楗簡銆?/p>

鐏甸瓊鎷烽棶鐜妭

Q锛氳繖涔堟姌鑵惧浘鍟ワ紵鐩存帴鍐欏嚱鏁颁笉琛屽悧锛?br/> A锛氭潵鐪嬪姣旇〃锛?/p>

浼犵粺鍐欐硶缁撴瀯浣撳皝瑁呭啓娉?/th>
eat(xiaoming)xiaoming.eat()
鍑芥暟涓庢暟鎹垎绂?/td>鏁版嵁琛屼负涓€浣撳寲
鏀瑰姩鐗典竴鍙戝叏韬?/td>闅忔椂鏇挎崲瀹炵幇

鐪嬫噦浜嗗惂锛熻繖灏辫窡鎶婃暎瑁呴浂浠剁粍瑁呮垚鏁存満涓€鏍凤紝缁存姢璧锋潵涓嶈澶埥锛?/p>

Q锛氳兘瀹炵幇缁ф壙鍚楋紵
A锛氳櫧鐒朵笉鑳藉儚C++閭f牱鐩存帴缁ф壙锛屼絾鍙互鐜╁濞冿細

c澶嶅埗
typedef struct {
    Person base;  // 鍩虹被缁撴瀯浣?/span>
    char job[20];
} Worker;

杩欐椂鍊橶orker绫诲瀷灏辫嚜甯erson鐨勬墍鏈夊睘鎬у拰鏂规硶浜嗐€傝櫧鐒舵湁鐐圭閲嶏紝浣嗙‘瀹炶兘璺戯紒

灏忕紪瑙傜偣锛氬幓骞村仛鏅鸿兘瀹跺眳椤圭洰鏃讹紝鐢ㄨ繖濂楁柟娉曟妸涓嶅悓璁惧鎶借薄鎴愮粨鏋勪綋锛屼唬鐮侀噺鐩存帴鐮嶆帀40%銆備笉杩囪鎻愰啋鏂版墜锛屽埆榄旀€斾簡鈥斺€擟璇█姣曠珶涓嶆槸闈㈠悜瀵硅薄璇█锛屽己琛屾ā鎷熷氨鍍忕敤缇庡浘绉€绉€P璇佷欢鐓э紝鍋跺皵鏁戞€ュ彲浠ワ紝闀挎湡杩樺緱鐪嬮渶姹傘€傝浣忥紝鍚堥€傜殑鎵嶆槸鏈€濂界殑锛?/p>

搜索