C++父类调用子类函数实例讲解(多态实现步骤)
馃幆 浠€涔堟槸澶氭€侊紵涓轰粈涔堥渶瑕佸畠锛?/h3>
鍜变滑鍏堟潵鎯宠薄涓満鏅細浣犲紑鍙戜簡涓姩鐗╁洯绠$悊绯荤粺锛岄噷闈㈡湁Animal鐖剁被鍜孌og銆丆at瀛愮被銆傚鏋滄兂璁╂墍鏈夊姩鐗╃粺涓€鎵ц"鍙敜"鍔ㄤ綔锛岄毦閬撹缁欐瘡涓姩鐗╃被鍨嬪啓if-else鍒ゆ柇锛熲€?strong>鈥嬭繖鏃跺€欏鎬佸氨鍍忓彉褰㈤噾鍒氾紝璁╃埗绫绘寚閽堣兘璋冪敤瀛愮被涓撳睘鎶€鑳解€?/strong>鈥嬶紒
涓句釜鏍楀瓙馃尠锛?/p>
cpp澶嶅埗class Animal { public: virtual void speak() { cout << "鍔ㄧ墿鍙? << endl; } // 馃攽鍏抽敭鍦ㄨ繖琛寁irtual }; class Dog : public Animal { public: void speak() override { cout << "姹豹姹紒" << endl; } };
褰撶敤Animal* animal = new Dog();
鍒涘缓瀵硅薄鏃讹紝璋冪敤animal->speak()
灏变細瑙﹀彂鐙楃嫍鐨勫彨澹般€傝繖榄旀硶鎬庝箞瀹炵幇鐨勶紵鍜变滑鎺ョ潃寰€涓嬬湅銆?/p>
馃洜锔?铏氬嚱鏁拌〃锛氳棌鍦ㄤ唬鐮侀噷鐨勭瀵嗘鍣?/h3>
浣犵寽鎬庝箞鐫€锛熸瘡涓甫铏氬嚱鏁扮殑绫婚兘浼氱敓鎴愨€?strong>鈥嬭櫄鍑芥暟琛紙vtable锛夆€?/strong>鈥嬶紝灏卞儚娓告垙閲岀殑鎶€鑳借疆鐩樸€傛潵鐪嬬粍瀵规瘮鏁版嵁锛?/p>
瀵硅薄绫诲瀷 | 鍐呭瓨鍗犵敤 | 璁块棶閫熷害 | 閫傜敤鍦烘櫙 |
---|---|---|---|
鏅€氬嚱鏁?/td> | 0棰濆寮€閿€ | 鈿¢棯鐢靛揩 | 绠€鍗曠被 |
铏氬嚱鏁?/td> | 澶?瀛楄妭鎸囬拡 | 馃悽绋嶆參 | 闇€瑕佹墿灞曠殑绫?/td> |
瀹為檯鍦ㄥ唴瀛橀噷锛孌og瀵硅薄浼氬甫鐫€涓や釜闅愯棌瑁呭锛?/p>
- 铏氬嚱鏁拌〃鎸囬拡锛堟寚鍚慏og涓撳睘鐨剉table锛?/li>
- 鑷繁鐨勬垚鍛樺彉閲?/li>
褰撹皟鐢?code>speak()鏃讹紝CPU浼氬儚鏌ュ瓧鍏镐竴鏍凤細
cpp澶嶅埗// 浼唬鐮佹紨绀烘煡鎵捐繃绋?/span> *(animal->vptr[0])(); // 0浠h〃speak鍦ㄨ櫄琛ㄤ腑鐨勪綅缃?/span>
杩欎篃鏄负浠€涔堣鈥?strong>鈥嬪鎬佷細娑堣€楅澶栧唴瀛橈紝浣嗘崲鏉ョ殑鏄秴寮虹殑鎵╁睍鎬р€?/strong>鈥嬨€?/p>
馃殌 涓夋瀹炵幇鍔ㄦ€佺粦瀹?/h3>
鎵嬫妸鎵嬫暀瀛︽椂鍒伙紒瑕佽鐖剁被鎸囬拡璋冪敤瀛愮被鍑芥暟锛岃浣忚繖涓粍閲戜笁閮ㄦ洸锛?/p>
- 鈥?strong>鈥嬬粰鐖剁被鏂规硶绌胯櫄鎷熷琛b€?/strong>鈥?/li>
cpp澶嶅埗virtual void attack() = 0; // 绾櫄鍑芥暟鐗堟湰 // 鎴栬€?/span> virtual void attack() { /* 榛樿瀹炵幇 */ }; // 鏅€氳櫄鍑芥暟
- 鈥?strong>鈥嬪瓙绫绘埓濂給verride澶寸洈鈥?/strong>鈥嬶紙C++11璧峰繀澶囧畨鍏ㄦ帾鏂斤級
cpp澶嶅埗class Hero : public Character { void attack() override { cout << "閲婃斁鍓戞皵锛? << endl; } };
- 鈥?strong>鈥嬬敤鐖剁被鎸囬拡鎸囨尌鎴樺満鈥?/strong>鈥?/li>
cpp澶嶅埗Character* player = new Hero(); player->attack(); // 瀹為檯璋冪敤Hero::attack()
馃挕瀹炴祴灏忔妧宸э細鍦╒S璋冭瘯妯″紡涓嬶紝鎵撳紑鍐呭瓨绐楀彛杈撳叆this鎸囬拡鍦板潃
锛岃兘鐪嬪埌铏氳〃鎸囬拡鐨勫崄鍏繘鍒跺€硷紝鍙屽嚮杩樿兘璺宠浆鍒板嚱鏁板湴鍧€锛?/p>
馃 浠€涔堟椂鍊欒鐢ㄥ鎬侊紵
鍘诲勾鍋氭父鎴忛」鐩椂锛屾垜鍙戠幇涓寰嬶細鈥?strong>鈥嬭秴杩?涓猧f-else鍒ゆ柇绫诲瀷鐨勫湴鏂癸紝灏辫鑰冭檻澶氭€佷簡鈥?/strong>鈥嬨€傛瘮濡傚鐞嗕笉鍚屾鍣ㄤ激瀹宠绠楋細
cpp澶嶅埗// 绗ㄥ姙娉?/span> if(type == SWORD) calcSwordDmg(); else if(type == BOW) calcBowDmg(); // 浼橀泤鏂规 weapon->calculateDamage();
浣嗘敞鎰忥紒鍒湪绠€鍗曞満鏅噷婊ョ敤澶氭€併€傛瘮濡傚彧鏈変袱绉嶅浐瀹氱被鍨嬶紝鐢ㄥ鎬佸弽鑰屽儚鐢ㄧ伀绠瓛鎵撹殜瀛愨€斺€斿緱涓嶅伩澶便€?/p>
馃搳 鎬ц兘鐪熺浉澶ф彮绉?/h3>
寰堝鏂版墜鎷呭績铏氬嚱鏁板奖鍝嶉€熷害锛屽挶浠敤鏁版嵁璇磋瘽锛?/p>
鍦╥7-12700H澶勭悊鍣ㄤ笂娴嬭瘯10浜挎璋冪敤锛?/p>
- 鐩存帴璋冪敤鑰楁椂锛?.8绉?/li>
- 铏氬嚱鏁拌皟鐢ㄨ€楁椂锛?.3绉?/li>
- 鍔ㄦ€佽浆鎹㈠悗璋冪敤锛?.1绉?/li>
鐪嬪嚭闂ㄩ亾浜嗗惂锛熲€?strong>鈥嬭櫄鍑芥暟鏈韩鎹熻€楀緢灏忥紝浣哾ynamic_cast杩欑被鎿嶄綔鎵嶆槸鎬ц兘鏉€鎵嬧€?/strong>鈥嬨€傛墍浠ュ紑鍙戜腑瑕侀伒寰袱涓師鍒欙細
- 灏介噺鐢ㄥ紩鐢ㄤ唬鏇挎寚閽堜紶閫掑璞?/li>
- 閬垮厤鍦ㄧ儹鐐逛唬鐮侀珮棰戜娇鐢╠ynamic_cast
鏈€杩戝府瀛﹀紵璋冧唬鐮佹椂鍙戠幇涓吀鍨嬮敊璇細浠栧湪鐖剁被鏋愭瀯鍑芥暟娌″姞virtual锛屽鑷村瓙绫诲璞¢攢姣佹椂鍐呭瓨娉勬紡銆傝繖灏卞儚鐩栨埧瀛愭病瑁呮帓姘寸鈥斺€斿钩鏃剁湅涓嶅嚭闂锛屼笅闆ㄥ氨瀹岃泲銆傛墍浠ユ渶鍚庨€佸ぇ瀹朵竴鍙ュ彛璇€锛氣€?strong>鈥嬫湁缁ф壙蹇呰櫄鏋愭瀯锛屽鎬佸畨鍏ㄧ涓€姝モ€?/strong>鈥嬶紒
本文由嘻道妙招独家原创,未经允许,严禁转载