C++澶氭佹妧鏈?/span>
鎽樿
鏈枃浠嬬粛浜?span lang="EN-US">C++涓殑鍚勭澶氭佹э紝閲嶇偣闃愯堪浜嗛潰鍚戝璞$殑鍔ㄦ佸鎬佸拰鍩轟簬妯℃澘鐨勯潤鎬佸鎬侊紝騫跺垵鎺袱縐嶆妧鏈殑緇撳悎浣跨敤銆?/span>
聽 鍏抽敭璇?/span> 鍑芥暟澶氭?span lang="EN-US">聽瀹忓鎬?鍔ㄦ佸鎬?闈欐佸鎬?/span> 瀵艱█
澶氭侊紙polymorphism錛変竴璇嶆渶鍒濇潵婧愪簬甯岃厞璇?/span>
polumorphos錛屽惈涔夋槸鍏鋒湁澶氱褰㈠紡鎴栧艦鎬佺殑鎯呭艦銆傚湪紼嬪簭璁捐棰嗗煙錛屼竴涓箍娉涜鍙殑瀹氫箟鏄?/span>
涓縐嶅皢涓嶅悓鐨勭壒孌婅涓哄拰鍗曚釜娉涘寲璁板彿鐩稿叧鑱旂殑鑳藉姏鈥濄傚拰
綰補鐨勯潰鍚戝璞$▼搴忚璁¤璦涓嶅悓錛?span lang="EN-US">C++涓殑澶氭佹湁鐫鏇村箍娉涚殑鍚箟銆傞櫎浜嗗父瑙佺殑閫氳繃
綾葷戶鎵垮拰铏氬嚱鏁版満鍒剁敓鏁堜簬榪愯鏈熺殑鍔ㄦ佸鎬侊紙
dynamic polymorphism
錛夊錛屾ā鏉夸篃鍏佽灝嗕笉鍚岀殑鐗規畩琛屼負鍜屽崟涓硾鍖栬鍙風浉鍏寵仈錛岀敱浜庤繖縐嶅叧鑱斿鐞嗕簬緙栬瘧鏈熻岄潪榪愯鏈燂紝鍥犳琚О涓洪潤鎬佸鎬侊紙static polymorphism錛夈?/span>
聽
浜嬪疄涓婏紝甯﹀彉閲忕殑瀹忓拰鍑芥暟閲嶈澆鏈哄埗涔熷厑璁稿皢涓嶅悓鐨勭壒孌婅涓哄拰鍗曚釜娉涘寲璁板彿鐩稿叧鑱斻傜劧鑰岋紝涔犳儻涓婃垜浠茍涓嶅皢瀹冧滑灞曠幇鍑烘潵鐨勮涓虹О涓哄鎬侊紙鎴栭潤鎬佸鎬侊級銆備粖澶╋紝褰撴垜浠皥鍙婂鎬佹椂錛屽鏋滄病鏈夋槑紜墍鎸囷紝榛樿灝辨槸鍔ㄦ佸鎬侊紝鑰岄潤鎬佸鎬佸垯鏄寚鍩轟簬妯℃澘鐨勫鎬併備笉榪囷紝鍦ㄨ繖綃囦互C++鍚勭澶氭佹妧鏈負涓婚鐨勬枃绔犱腑錛屾垜浠鍏堣繕鏄洖欏句竴涓婥++紺劇兢浜夎宸蹭箙鐨勫彟涓縐嶁滃鎬佲濓細鍑芥暟澶氭侊紙function polymorphism錛夛紝浠ュ強鏇翠笉甯告彁鐨勫畯澶氭侊紙macro polymorphism錛夈?/span>
聽 鍑芥暟澶氭?/span>
涔熷氨鏄垜浠父璇寸殑鍑芥暟閲嶈澆錛?span lang="EN-US">function overloading錛夈傚熀浜庝笉鍚岀殑鍙傛暟鍒楄〃錛屽悓涓涓嚱鏁板悕瀛楀彲浠ユ寚鍚戜笉鍚岀殑鍑芥暟瀹氫箟錛?/span>
聽
// overload_poly.cpp
鏍規嵁鍙傛暟鍒楄〃鐨勪笉鍚岋紙綾誨瀷銆佷釜鏁版垨鍏艱屾湁涔嬶級錛?span lang="EN-US">my_add(1, 2)鍜宮y_add(1, "2")琚垎鍒紪璇戜負瀵筸y_add(int, int)鍜宮y_add(int, std::string)鐨勮皟鐢ㄣ傚疄鐜板師鐞嗗湪浜庣紪璇戝櫒鏍規嵁涓嶅悓鐨勫弬鏁板垪琛ㄥ鍚屽悕鍑芥暟榪涜鍚嶅瓧閲嶆暣錛岃屽悗榪欎簺鍚屽悕鍑芥暟灝卞彉鎴愪簡褰兼涓嶅悓鐨勫嚱鏁般傛瘮鏂硅錛屼篃璁告煇涓紪璇戝櫒浼氬皢my_add()鍑芥暟鍚嶅瓧鍒嗗埆閲嶆暣涓簃y_add_int_int()鍜宮y_add_int_str()銆?/span>
聽 瀹忓鎬?/span>
甯﹀彉閲忕殑瀹忓彲浠ュ疄鐜頒竴縐嶅垵綰у艦寮忕殑闈欐佸鎬侊細
聽
// macro_poly.cpp
褰撶▼搴忚緙栬瘧鏃訛紝琛ㄨ揪寮?span lang="EN-US">ADD(i1, i2)鍜孉DD(s1, s2)鍒嗗埆琚浛鎹負涓や釜鏁存暟鐩稿姞鍜屼袱涓瓧絎︿覆鐩稿姞鐨勫叿浣撹〃杈懼紡銆傛暣鏁扮浉鍔犱綋鐜頒負姹傚拰錛岃屽瓧絎︿覆鐩稿姞鍒欎綋鐜頒負榪炴帴銆傜▼搴忕殑杈撳嚭緇撴灉絎﹀悎鐩磋錛?/span>
聽
1 + 2 = 3
鍔ㄦ佸鎬?/span>
榪欏氨鏄紬鎵鍛ㄧ煡鐨勭殑澶氭併傜幇浠i潰鍚戝璞¤璦瀵硅繖涓蹇電殑瀹氫箟鏄竴鑷寸殑銆傚叾鎶鏈熀紜鍦ㄤ簬
緇ф壙鏈哄埗鍜岃櫄鍑芥暟銆備緥濡傦紝鎴戜滑鍙互瀹氫箟涓涓娊璞″熀綾?span lang="EN-US">Vehicle
鍜屼袱涓淳鐢熶簬Vehicle鐨勫叿浣撶被Car鍜孉irplane錛?/span>
聽
// dynamic_poly.h
瀹㈡埛紼嬪簭鍙互閫氳繃鎸囧悜鍩虹被Vehicle鐨勬寚閽堬紙鎴栧紩鐢級鏉ユ搷綰靛叿浣撳璞°傞氳繃鎸囧悜鍩虹被瀵硅薄鐨勬寚閽堬紙鎴栧紩鐢級鏉ヨ皟鐢ㄤ竴涓櫄鍑芥暟錛屼細瀵艱嚧瀵硅鎸囧悜鐨勫叿浣撳璞′箣鐩稿簲鎴愬憳鐨勮皟鐢細
// dynamic_poly_1.cpp
姝や緥涓紝鍏抽敭鐨勫鎬佹帴鍙e厓绱犱負
铏氬嚱鏁?span lang="EN-US">run()銆傜敱浜?/span>
run_vehicle()鐨勫弬鏁頒負鎸囧悜鍩虹被Vehicle鐨勬寚閽?/span>
錛屽洜鑰屾棤娉曞湪緙栬瘧鏈熷喅瀹氫嬌鐢ㄥ摢涓涓増鏈殑run()銆傚湪榪愯鏈燂紝涓轟簡鍒嗘淳鍑芥暟璋冪敤錛岃櫄鍑芥暟琚皟鐢ㄧ殑閭d釜瀵硅薄鐨勫畬鏁村姩鎬佺被鍨嬪皢琚闂傝繖鏍蜂竴鏉ワ紝瀵逛竴涓狢ar瀵硅薄璋冪敤
run_vehicle()
錛?/span>
瀹為檯涓婂皢
璋冪敤Car::run()錛岃屽浜嶢irplane瀵硅薄鑰岃█灝嗚皟鐢ˋirplane::run()銆?/span>
鎴栬鍔ㄦ佸鎬佹渶鍚稿紩浜轟箣澶勫湪浜庡鐞嗗紓璐ㄥ璞¢泦鍚堢殑鑳藉姏錛?/span>
聽
// dynamic_poly_2.cpp
鍦?span lang="EN-US">run_vehicles()涓紝vehicles[i]->run()
渚濇嵁姝h榪唬鐨勫厓绱犵殑綾誨瀷鑰岃皟鐢ㄤ笉鍚岀殑鎴愬憳鍑芥暟銆傝繖浠庝竴涓晶闈綋鐜頒簡闈㈠悜瀵硅薄緙栫▼椋庢牸鐨勪紭闆呫?/span>
闈欐佸鎬?/span>
濡傛灉璇村姩鎬佸鎬佹槸閫氳繃铏氬嚱鏁版潵琛ㄨ揪鍏卞悓鎺ュ彛鐨勮瘽錛岄偅涔堥潤鎬佸鎬佸垯鏄氳繃鈥滃郊姝ゅ崟鐙畾涔変絾鏀寔鍏卞悓鎿嶄綔鐨勫叿浣撶被鈥濇潵琛ㄨ揪鍏卞悓鎬э紝鎹㈠彞璇濊錛屽繀欏誨瓨鍦ㄥ繀闇鐨勫悓鍚嶆垚鍛樺嚱鏁般?/span>
聽
鎴戜滑鍙互閲囩敤闈欐佸鎬佹満鍒墮噸鍐欎笂涓鑺傜殑渚嬪瓙銆傝繖涓嬈★紝鎴戜滑涓嶅啀瀹氫箟vehicles綾誨眰嬈$粨鏋勶紝鐩稿弽錛屾垜浠紪鍐欏郊姝ゆ棤鍏崇殑鍏蜂綋綾籆ar鍜孉irplane錛堝畠浠兘鏈変竴涓猺un()鎴愬憳鍑芥暟錛夛細
聽
// static_poly.h
run_vehicle()搴旂敤紼嬪簭琚敼鍐欏涓嬶細聽
// static_poly_1.cpp
鐜板湪
Vehicle鐢ㄤ綔
妯℃澘鍙傛暟鑰岄潪鍏叡鍩虹被瀵硅薄錛堜簨瀹炰笂錛岃繖閲岀殑
Vehicle鍙槸涓涓鍚堢洿瑙夌殑璁板彿鑰屽凡錛屾澶栧埆鏃犲畠鎰?/span>
錛夈傜粡榪囩紪璇戝櫒澶勭悊鍚庯紝鎴戜滑鏈緇堜細寰楀埌
run_vehicle
<Car>()
鍜?
run_vehicle
<Airplane>()涓や釜涓嶅悓鐨勫嚱鏁?/span>
銆?/span>
榪欏拰鍔ㄦ佸鎬佷笉鍚岋紝鍔ㄦ佸鎬?/span>
鍑熻櫄鍑芥暟鍒嗘淳鏈哄埗
鍦ㄨ繍琛屾湡鍙湁涓涓?/span>
run_vehicle
()鍑芥暟銆?/span>
聽
鎴戜滑鏃犳硶鍐嶉忔槑鍦板鐞嗗紓璐ㄥ璞¢泦鍚堜簡錛屽洜涓烘墍鏈夌被鍨嬮兘蹇呴』鍦ㄧ紪璇戞湡浜堜互鍐沖畾銆備笉榪囷紝涓轟笉鍚岀殑vehicles寮曞叆涓嶅悓鐨勯泦鍚堝彧鏄婦鎵嬩箣鍔熾傜敱浜庢棤闇鍐嶅皢闆嗗悎鍏冪礌灞闄愪簬鎸囬拡鎴栧紩鐢紝鎴戜滑鐜板湪鍙互浠庢墽琛屾ц兘鍜岀被鍨嬪畨鍏ㄤ袱鏂歸潰鑾峰緱濂藉錛?/span>
聽
// static_poly_2.cpp
涓ょ澶氭佹満鍒剁殑緇撳悎浣跨敤
聽
鍦ㄤ竴浜涢珮綰?span lang="EN-US">C++搴旂敤涓紝鎴戜滑鍙兘闇瑕佺粨鍚堜嬌鐢ㄥ姩鎬佸鎬佸拰闈欐佸鎬佷袱縐嶆満鍒訛紝浠ユ湡杈懼埌瀵硅薄鎿嶄綔鐨勪紭闆呫佸畨鍏ㄥ拰楂樻晥銆備緥濡傦紝鎴戜滑鏃㈠笇鏈涗竴鑷磋屼紭闆呭湴澶勭悊vehicles鐨剅un闂錛屽張甯屾湜鈥滃畨鍏ㄨ岄珮鏁堚濆湴瀹屾垚緇欓琛屽櫒錛堥鏈恒侀鑹囩瓑錛夎繘琛屸滅┖涓姞娌光濊繖鏍風殑楂橀毦搴﹀姩浣溿備負姝わ紝鎴戜滑棣栧厛灝嗕笂闈㈢殑vehicles綾誨眰嬈$粨鏋勬敼鍐欏涓嬶細
聽
// dscombine_poly.h
聽聽聽 void add_oil() const
聽聽聽 void add_oil() const
鎴戜滑鐞嗘兂涓殑搴旂敤紼嬪簭鍙互緙栧啓濡備笅錛?/span>
聽
// dscombine_poly.cpp
鎴戜滑淇濈暀浜嗙被灞傛緇撴瀯錛岀洰鐨勬槸涓轟簡鑳?/span>
澶熷埄鐢?/span>
run_vehicles()涓鑷磋屼紭闆呭湴澶勭悊
寮傝川瀵硅薄闆嗗悎
vehicles鐨剅un闂銆傚悓鏃訛紝鍒╃敤鍑芥暟妯℃澘add_oil_to_aircrafts_in_the_sky<Aircraft>()錛屾垜浠粛鐒跺彲浠ュ鐞嗙壒瀹氱綾葷殑vehicles 鈥?aircrafts錛堝寘鎷琣irplanes鍜宎irships錛夌殑鈥滅┖涓姞娌光濋棶棰樸傚叾涓紝鎴戜滑閬垮紑浣跨敤鎸囬拡錛屼粠鑰屽湪
鎵ц鎬ц兘鍜岀被鍨嬪畨鍏ㄤ袱鏂歸潰杈懼埌浜嗛鏈熺洰鏍囥?/span>
聽
緇撹
聽
闀挎湡浠ユ潵錛?span lang="EN-US">C++紺劇兢瀵逛簬澶氭佺殑鍐呮兜鍜屽寤朵竴鐩翠簤璁轟笉浼戙傚湪comp.object榪欐牱鐨勭綉緇滆鍧涗笂錛屾綾昏瘽棰樹簤璁鴻嚦浠婁粛闅忓鍙銆傛浘緇忔湁浜哄皢鍔ㄦ佸鎬佺О涓篿nclusion polymorphism錛岃屽皢闈欐佸鎬佺О涓簆arametric polymorphism鎴杙arameterized polymorphism銆?/span>
聽
鎴戞敞鎰忓埌2003騫存柉鍧︾澶у鍏紑鐨勪竴浠?/span>銆奀++ and Object-Oriented Programming銆嬫暀妗堜腑鏄庣‘鎻愬埌浜嗗嚱鏁板鎬佹蹇?鈥?鈥淔unction overloading is also referred to as function polymorphism as it involves one function having many forms鈥濄傛枃鍚庣殑鈥滃弬鑰冩枃鐚濆崟鍏冪粰鍑轟簡榪欎釜緗戦〉閾炬帴銆?/span>
聽 鍙兘浣犳槸絎竴嬈$湅鍒板畯澶氭?span lang="EN-US">榪欎釜鏈銆備笉蹇呰寮傦紝涔熻鎴戝氨鏄犲嚭榪欎釜鏈鐨勨滅涓浜衡濄傛樉鐒訛紝甯﹀彉閲忕殑瀹忥紙鎴栫被浼間簬鍑芥暟鐨勫畯鎴栦吉鍑芥暟瀹忥級鐨勬浛鎹㈡満鍒墮櫎浜嗗厤闄ゅ皬鍨嬪嚱鏁扮殑璋冪敤寮閿涔嬪錛屼篃琛ㄧ幇鍑轟簡綾諱技鐨勫鎬佹с傚湪鎴戜滑涓婇潰鐨勪緥瀛愪腑錛屽瓧絎︿覆鐩稿姞鎵琛ㄧ幇鍑烘潵鐨勭鍚堢洿瑙夌殑榪炴帴鎿嶄綔錛屼簨瀹炰笂鏄敱搴曢儴榪愮畻絎﹂噸杞芥満鍒舵敮鎸佺殑銆傚煎緱鎸囧嚭鐨勬槸錛孋++紺劇兢涓湁浜哄皢榪愮畻絎﹂噸杞芥墍琛ㄧ幇鍑烘潵鐨勫鎬佺О涓篴d hoc polymorphism銆?/span> David Vandevoorde鍜孨icolai M. Josuttis鍦ㄤ粬浠殑钁椾綔銆奀++ Templates: The Complete Guide銆嬩竴涔︿腑緋葷粺鍦伴槓榪頒簡闈欐佸鎬佸拰鍔ㄦ佸鎬佹妧鏈傚洜涓鴻涓衡?/span>鍜屽叾浠栬璦鏈哄埗鍏崇郴涓嶅ぇ鈥濓紝榪欐湰涔︽病鏈夋彁鍙婂畯澶氭侊紙浠ュ強鍑芥暟澶氭侊級銆傦紙闇瑕佽鏄庣殑鏄紝絎旇呮湰浜烘槸榪欐湰涔︾殑綣佷綋涓枃鐗堣瘧鑰呬箣涓錛屾湰鏂囨鏄熀浜庤繖鏈功鐨勭14绔犫淭he Polymorphic Power of Templates鈥濆啓浣滆屾垚錛?/span>
鍔ㄦ佸鎬佸彧闇瑕佷竴涓鎬佸嚱鏁幫紝鐢熸垚鐨勫彲鎵ц浠g爜灝哄杈冨皬錛岄潤鎬佸鎬佸繀欏婚拡瀵逛笉鍚岀殑綾誨瀷浜х敓涓嶅悓鐨勬ā鏉垮疄浣擄紝灝哄浼氬ぇ涓浜涳紝浣嗙敓鎴愮殑浠g爜浼氭洿蹇紝鍥犱負鏃犻渶閫氳繃鎸囬拡榪涜闂存帴鎿嶄綔銆傞潤鎬佸鎬佹瘮鍔ㄦ佸鎬佹洿鍔犵被鍨嬪畨鍏紝鍥犱負鍏ㄩ儴緇戝畾閮借媯鏌ヤ簬緙栬瘧鏈熴傛濡傚墠闈緥瀛愭墍紺猴紝浣犱笉鍙皢涓涓敊璇殑綾誨瀷鐨勫璞℃彃鍏ュ埌浠庝竴涓ā鏉垮疄渚嬪寲鑰屾潵鐨勫鍣ㄤ箣涓傛澶栵紝姝e浣犲凡緇忕湅鍒扮殑閭f牱錛屽姩鎬佸鎬佸彲浠ヤ紭闆呭湴澶勭悊寮傝川瀵硅薄闆嗗悎錛岃岄潤鎬佸鎬佸彲浠ョ敤鏉ュ疄鐜板畨鍏ㄣ侀珮鏁堢殑鍚岃川瀵硅薄闆嗗悎鎿嶄綔銆?/span>
聽
闈欐佸鎬佷負C++甯︽潵浜嗘硾鍨嬬紪紼嬶紙generic programming錛夌殑姒傚康銆傛硾鍨嬬紪紼嬪彲浠ヨ涓烘槸鈥滅粍浠跺姛鑳藉熀浜庢鏋舵暣浣撹岃璁♀濈殑妯℃澘緙栫▼銆係TL灝辨槸娉涘瀷緙栫▼鐨勪竴涓吀鑼冦係TL鏄竴涓鏋訛紝瀹冩彁渚涗簡澶ч噺鐨勭畻娉曘佸鍣ㄥ拰榪唬鍣紝鍏ㄩ儴浠ユā鏉挎妧鏈疄鐜般備粠鐞嗚涓婅錛孲TL鐨勫姛鑳藉綋鐒跺彲浠ヤ嬌鐢ㄥ姩鎬佸鎬佹潵瀹炵幇錛屼笉榪囪繖鏍蜂竴鏉ュ叾鎬ц兘蹇呭皢澶ф墦鎶樻墸銆?/span>
聽 闈欐佸鎬佽繕涓篊++紺劇兢甯︽潵浜嗘硾鍨嬫ā寮忥紙generic patterns錛夌殑姒傚康銆傜悊璁轟笂錛屾瘡涓涓渶瑕侀氳繃铏氬嚱鏁板拰綾葷戶鎵胯屾敮鎸佺殑璁捐妯″紡閮藉彲浠ュ埄鐢ㄥ熀浜庢ā鏉跨殑闈欐佸鎬佹妧鏈紙鐢氳嚦鍙互緇撳悎浣跨敤鍔ㄦ佸鎬佸拰闈欐佸鎬佷袱縐嶆妧鏈級鑰屽疄鐜般傛濡備綘鐪嬪埌鐨勯偅鏍鳳紝Andrei Alexandrescu鐨勫ぉ鎵嶄綔鍝併奙odern C++ Design: Generic Programming and Design Patterns Applied銆嬶紙Addison-Wesley錛夊拰Loki紼嬪簭搴?/span> 宸茬粡璧板湪浜嗘垜浠殑鍓嶉潰銆?/span> 鍙傝冩枃鐚?/span>
1.
David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide, Addison Wesley, 2002. 2. Chris Neumann, CS193d (Summer 2003) C++ and Object-Oriented Programming, http://www.stanford.edu/class/cs193d/, 2003.
鑽h |