锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合影音,国产老肥熟一区二区三区,欧美在线观看网址综合http://m.shnenglu.com/tankzhouqiang/category/16137.htmlzh-cnThu, 15 May 2014 03:24:12 GMTThu, 15 May 2014 03:24:12 GMT60skiplisthttp://m.shnenglu.com/tankzhouqiang/archive/2014/05/11/206903.html鍛ㄥ己鍛ㄥ己Sun, 11 May 2014 15:03:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2014/05/11/206903.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/206903.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2014/05/11/206903.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/206903.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/206903.html

鍛ㄥ己 2014-05-11 23:03 鍙戣〃璇勮
]]>
Oracle Redo Log 鏈哄埗 灝忕粨錛堣漿杞斤級http://m.shnenglu.com/tankzhouqiang/archive/2013/01/08/197126.html鍛ㄥ己鍛ㄥ己Tue, 08 Jan 2013 11:20:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2013/01/08/197126.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/197126.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2013/01/08/197126.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/197126.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/197126.html闃呰鍏ㄦ枃

鍛ㄥ己 2013-01-08 19:20 鍙戣〃璇勮
]]>
c++铏氬嚱鏁板師鐞嗗強瀹炵幇錛堣漿杞斤級http://m.shnenglu.com/tankzhouqiang/archive/2011/05/11/146186.html鍛ㄥ己鍛ㄥ己Wed, 11 May 2011 06:13:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/11/146186.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/146186.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/11/146186.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/146186.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/146186.html 澶氭佹寚鍚屼竴涓柟娉曟牴鎹叾鎵灞炵殑涓嶅悓瀵硅薄鍙互鏈変笉鍚岀殑琛屼負錛堟牴鎹嚜宸辯悊瑙o紝涓嶇煡榪欎箞璇存槸鍚︿弗璋級銆?

 涓句釜渚嬪瓙璇存槑铏氬嚱鏁般佸鎬併佹棭緇戝畾鍜屾櫄緇戝畾錛?br>  鏉庢皬涓ゅ厔濡癸紙鍝ュ摜鍜屽濡癸級鍙傚姞濮撴皬榪愬姩浼氾紙涓嶅悓濮撴皬緇勯槦鍙傚姞錛夛紝鍝ュ摜鐢峰瓙欏圭洰姣旇禌錛屽濡瑰弬鍔犲コ瀛愰」鐩瘮璧涳紝寮騫曞紡鏈変竴涓弬璧涢槦浼嶄唬琛ㄥ彂璦浠紡錛屽厔濡逛咯閮芥兂 鍘婚湶闇茶劯錛屽彲鍙兘涓浜哄幓錛屾渶緇堜粬浠喅瀹氬埌鏃舵姄闃勫喅瀹氾紝鑰岀粍濮斾細涔熶笉鍙嶅錛屽畠鎵嶄笉鍏沖績鏄摜鍝ヨ繕鏄濡規潵鍙戣█錛屽彧瑕佹淳涓涓鏉庣殑鏉ヨ涓ゅ彞璇濆氨琛屻傝繍鍔ㄤ細濡傛湡涓? 琛岋紝濡瑰鎶撻槃鑾峰緱浠h〃鏉庡鍙戣█鐨勬満浼氾紝鍝ュ摜鍙傚姞浜嗙敺瀛愰」鐩瘮璧涳紝濡瑰鍙傚姞浜嗗コ瀛愰」鐩瘮璧涖傛瘮璧涚粨鏋滃氨涓嶆槸鎴戜滑鍏沖績鐨勪簡銆?br> 鐜板湪璁╂垜浠潵鍋氫釜綾繪瘮錛堝彧璁ㄨ涓庤繍鍔ㄤ細鐩稿叧鐨勮瘽棰橈級錛?br> 錛?錛夌被鐨勮璁★細
  鏉庢皬鍏勫灞炰簬鏉庢皬瀹舵棌錛屾潕姘忔槸鍩虹被錛堣繖閲岃繕鏄娊璞$殑綰熀綾伙級錛屾潕姘忓張媧劇敓鍑轟袱涓瓙綾伙紙鏉庢皬鐢峰拰鏉庢皬濂籌級錛屾潕姘忕敺浼氭墍鏈夌敺瀛愰」鐩殑姣旇禌錛堟潕姘忕敺鐨勬垚鍛樺嚱 鏁幫級錛屾潕姘忓コ浼氭墍鏈夊コ瀛愰」鐩殑姣旇禌錛堟潕姘忓コ鐨勬垚鍛樺嚱鏁幫級銆傚鏉庣殑浜洪兘浼氬彂璦錛堝熀綾昏櫄鍑芥暟錛夛紝鏉庢皬鐢峰拰鏉庢皬濂崇戶鎵胯嚜鏉庢皬褰撶劧涔熶細鍙戣█錛屽彧鏄敺濂寵璇濆0闊充笉涓 鏍鳳紝鍐呭涔熶細鍙堝樊寮傦紝緇欎漢鎰熻涓嶅悓錛堟潕姘忕敺鍜屾潕姘忓コ鍒嗗埆閲嶆柊瀹氫箟鍙戣█榪欎釜铏氬嚱鏁幫級銆傛潕姘忎袱鍏勫灝辨槸鏉庢皬鐢峰拰鏉庢皬濂充袱涓被鐨勫疄浣撱?br> 錛?錛夌▼搴忚璁★細
 鏉庢皬鍏勫濉啓鍙傝禌鎶ュ悕琛ㄣ?br> 錛?錛夌紪璇戯細
  鏉庢皬鍏勫鐨勫弬璧涙姤鍚嶈〃琚笂浜ょ粰緇勫浼氾紙緙栬瘧鍣級錛屽摜鍝ュ拰濡瑰鍒嗗埆鍙傚姞鐢峰瓙鍜屽コ瀛愮殑姣旇禌錛岀粍濮斾細涓鐪嬪氨鏄庣櫧浜嗭紙鏃╃粦瀹氾級錛屽彧鏄彂璦浜洪変笉鏄庣‘錛岀粍濮斾細鐪嬪埌鎶? 鍚嶈〃涓婂啓鐨勬槸“鏉庡浠h〃”錛堝熀綾繪寚閽堬級錛岀粍濮斾細涓嶈兘紜畾鍒板簳鏄皝錛屽氨鍋氫簡涓娉細濡傛灉鏄敺鐨勶紝灝辨槸鍝ュ摜鏉庢煇鏌愶紱濡傛灉鏄コ鐨勶紝灝辨槸濡瑰鏉庢煇鏌愶紙鏅氱粦瀹氾級銆傜粍 濮斾細鍋氬ソ鍏跺畠鍑嗗宸ヤ綔鍚庯紝灝辯瓑榪愬姩浼氬紑濮嬩簡錛堢紪璇戝畬姣曪級銆?br> 錛?錛夌▼搴忚繍琛岋細
 榪愬姩浼氬紑濮嬩簡錛堢▼搴忓紑濮嬭繍琛岋級錛屽紑騫曞紡涓婃垜浠惉鍒頒簡鏉庡濡瑰鐨勫彂璦錛屽鏋滄槸鍝ュ摜榪愭皵濂芥姄闃勮儨鍑猴紝鎴戜滑灝嗗惉鍒板摜鍝ョ殑鍙戣█錛堝鎬侊級銆傜劧鍚庡氨鏄湅鍒板厔濡逛咯鍙傚姞姣旇禌浜嗐傘傘?/p>

 浣嗘効榪欎釜姣斿柣璇存竻妤氫簡铏氬嚱鏁般佸鎬併佹棭緇戝畾鍜屾櫄緇戝畾鐨勬蹇靛拰瀹冧滑涔嬮棿鐨勫叧緋匯傚啀璇翠竴涓嬶紝鏃╃粦瀹氭寚緙栬瘧鍣ㄥ湪緙栬瘧鏈熼棿鍗崇煡閬撳璞$殑鍏蜂綋綾誨瀷騫剁‘瀹氭瀵硅薄璋冪敤鎴愬憳鍑芥暟鐨勭‘鍒囧湴鍧錛涜屾櫄緇戝畾鏄牴鎹寚閽堟墍鎸囧璞$殑綾誨瀷淇℃伅寰楀埌綾葷殑铏氬嚱鏁拌〃鎸囬拡榪涜岀‘瀹氳皟鐢ㄦ垚鍛樺嚱鏁扮殑紜垏鍦板潃銆?br>  

 2銆佹彮瀵嗘櫄緇戝畾鐨勭瀵?/p>

 緙栬瘧鍣ㄥ埌搴曞仛浜嗕粈涔堝疄鐜扮殑铏氬嚱鏁扮殑鏅氱粦瀹氬憿錛熸垜浠潵鎺釜絀剁珶銆?/p>

  緙栬瘧鍣ㄥ姣忎釜鍖呭惈铏氬嚱鏁扮殑綾誨垱寤轟竴涓〃錛堢О涓篤 TA B L E錛夈傚湪V TA B L E涓紝緙栬瘧鍣ㄦ斁緗壒瀹氱被鐨勮櫄鍑芥暟鍦板潃銆傚湪姣忎釜甯︽湁铏氬嚱鏁扮殑綾? 涓紝緙栬瘧鍣ㄧ瀵嗗湴緗竴鎸囬拡錛岀О涓簐 p o i n t e r錛堢緝鍐欎負V P T R錛夛紝鎸囧悜榪欎釜瀵硅薄鐨刅 TA B L E銆?span style="color: #000000;">閫氳繃鍩虹被鎸囬拡鍋氳櫄鍑芥暟璋?鐢ㄦ椂錛堜篃灝辨槸鍋氬鎬佽皟鐢ㄦ椂錛夛紝緙栬瘧鍣ㄩ潤鎬佸湴鎻掑叆鍙栧緱榪欎釜V P T R錛屽茍鍦╒ TA B L E琛ㄤ腑鏌ユ壘鍑芥暟鍦板潃鐨勪唬鐮侊紝榪欐牱灝辮兘璋冪敤姝g‘鐨勫嚱鏁頒嬌鏅氭崋緇戝彂鐢熴?/span>涓烘瘡涓被璁劇疆V TA B L E銆佸垵濮嬪寲V P T R銆佷負铏氬嚱鏁拌皟鐢ㄦ彃鍏ヤ唬鐮侊紝鎵鏈夎繖浜涢兘鏄嚜鍔ㄥ彂鐢熺殑錛屾墍浠ユ垜浠笉蹇呮媴蹇冭繖浜涖傚埄鐢ㄨ櫄鍑芥暟錛?榪欎釜瀵硅薄鐨勫悎閫傜殑鍑芥暟灝辮兘琚皟鐢紝鍝曞湪緙栬瘧鍣ㄨ繕涓嶇煡閬撹繖涓璞$殑鐗瑰畾綾誨瀷鐨勬儏鍐典笅銆傦紙銆奀++緙栫▼鎬濇兂銆?/span>錛?/p>

鈥斺斺斺旇繖孌佃瘽綰㈣壊鍔犵矖閮ㄥ垎浼間箮鏈夌偣闂錛屾垜涓漢鐨勭悊瑙g湅鍚庨潰鐨勬葷粨銆?/span>

 鍦ㄤ換浣曠被涓笉瀛樺湪鏄劇ず鐨勭被鍨嬩俊鎭紝鍙璞′腑蹇呴』瀛樻斁綾諱俊鎭紝鍚﹀垯綾誨瀷涓嶅彲鑳藉湪榪愯鏃跺緩绔嬨傞偅榪欎釜綾諱俊鎭槸浠涔堝憿錛熸垜浠潵鐪嬩笅闈㈠嚑涓被錛?/p>

 class no_virtual
 {
 public:
     void fun1() const{}
     int  fun2() const { return a; }
 private:
     int a;
 }

 class one_virtual
 {
 public:
     virtual void fun1() const{}
     int  fun2() const { return a; }
 private:
     int a;
 }

 class two_virtual
 {
 public:
     virtual void fun1() const{}
     virtual int  fun2() const { return a; }
 private:
     int a;
 }

 浠ヤ笂涓変釜綾諱腑錛?br> no_virtual娌℃湁铏氬嚱鏁幫紝sizeof(no_virtual)=4錛岀被no_virtual鐨勯暱搴﹀氨鏄叾鎴愬憳鍙橀噺鏁村瀷a鐨勯暱搴︼紱
 one_virtual鏈変竴涓櫄鍑芥暟錛宻izeof(one_virtual)=8錛?br> two_virtual 鏈変袱涓櫄鍑芥暟錛宻izeof(two_virtual)=8錛?nbsp;鏈変竴涓櫄鍑芥暟鍜屼袱涓櫄鍑芥暟鐨勭被鐨勯暱搴︽病鏈夊尯鍒紝鍏跺疄瀹冧滑鐨勯暱搴﹀氨鏄痭o_virtual鐨? 闀垮害鍔犱竴涓獀oid鎸囬拡鐨勯暱搴︼紝瀹冨弽鏄犲嚭錛屽鏋滄湁涓涓垨澶氫釜铏氬嚱鏁幫紝緙栬瘧鍣ㄥ湪榪欎釜緇撴瀯涓彃鍏ヤ竴涓寚閽堬紙 V P T R錛夈傚湪one_virtual 鍜? two_virtual涔嬮棿娌℃湁鍖哄埆銆傝繖鏄洜涓篤 P T R鎸囧悜涓涓瓨鏀懼湴鍧鐨勮〃錛屽彧闇瑕佷竴涓寚閽堬紝鍥犱負鎵鏈夎櫄鍑芥暟鍦板潃閮藉寘鍚湪榪欎釜琛ㄤ腑銆?/p>

 榪欎釜VPTR灝卞彲浠ョ湅浣滅被鐨勭被鍨嬩俊鎭?/p>

 閭f垜浠潵鐪嬬湅緙栬瘧鍣ㄦ槸鎬庝箞寤虹珛VPTR鎸囧悜鐨勮繖涓櫄鍑芥暟琛ㄧ殑銆傚厛鐪嬩笅闈袱涓被錛?br> class base
 {
 public:
     void bfun(){}
     virtual void vfun1(){}
     virtual int vfun2(){}
 private:
     int a;
 }

 class derived : public base
 {
 public:
     void dfun(){}
     virtual void vfun1(){}
     virtual int vfun3(){}
 private:
     int b;
 }

 涓や釜綾籚PTR鎸囧悜鐨勮櫄鍑芥暟琛紙VTABLE錛夊垎鍒涓嬶細
 base綾?br>                       鈥斺斺斺斺斺?br> VPTR鈥斺?gt; |&base::vfun1 |
                       鈥斺斺斺斺斺?br>                  |&base::vfun2 |
                   鈥斺斺斺斺斺?br>       
 derived綾?br>                       鈥斺斺斺斺斺斺?br> VPTR鈥斺?gt; |&derived::vfun1 |
                       鈥斺斺斺斺斺斺?br>                   |&base::vfun2    |
                   鈥斺斺斺斺斺斺?br>                   |&derived::vfun3 |
                    鈥斺斺斺斺斺斺?br>     
  姣忓綋鍒涘緩涓涓寘鍚湁铏氬嚱鏁扮殑綾繪垨浠庡寘鍚湁铏氬嚱鏁扮殑綾繪淳鐢熶竴涓被鏃訛紝緙栬瘧鍣ㄥ氨涓鴻繖涓被鍒涘緩涓涓猇TABLE錛屽涓婂浘鎵紺恒傚湪榪欎釜琛ㄤ腑錛岀紪璇戝櫒鏀劇疆浜嗗湪榪欎釜綾? 涓垨鍦ㄥ畠鐨勫熀綾諱腑鎵鏈夊凡澹版槑涓簐irtual鐨勫嚱鏁扮殑鍦板潃銆傚鏋滃湪榪欎釜媧劇敓綾諱腑娌℃湁瀵瑰湪鍩虹被涓0鏄庝負virtual鐨勫嚱鏁拌繘琛岄噸鏂板畾涔夛紝緙栬瘧鍣ㄥ氨浣跨敤鍩虹被 鐨勮繖涓櫄鍑芥暟鍦板潃銆傦紙鍦╠erived鐨刅TABLE涓紝vfun2鐨勫叆鍙e氨鏄繖縐嶆儏鍐點傦級鐒跺悗緙栬瘧鍣ㄥ湪榪欎釜綾諱腑鏀劇疆VPTR銆傚綋浣跨敤綆鍗曠戶鎵挎椂錛屽浜庢瘡 涓璞″彧鏈変竴涓猇PTR銆?span style="font-weight: bold; color: #ff0000;">VPTR蹇呴』琚垵濮嬪寲涓烘寚鍚戠浉搴旂殑VTABLE錛岃繖鍦ㄦ瀯閫犲嚱鏁頒腑鍙戠敓銆?/span>
 涓鏃PTR琚垵濮嬪寲涓烘寚鍚戠浉搴旂殑VTABLE錛屽璞″氨"鐭ラ亾"瀹冭嚜宸辨槸浠涔堢被鍨嬨備絾鍙湁褰撹櫄鍑芥暟琚皟鐢ㄦ椂榪欑鑷垜璁ょ煡鎵嶆湁鐢ㄣ?/p>

涓漢鎬葷粨濡備笅錛?/span>
1銆佷粠鍖呭惈铏氬嚱鏁扮殑綾繪淳鐢熶竴涓被鏃訛紝緙栬瘧鍣ㄥ氨涓鴻綾誨垱寤轟竴涓猇TABLE銆傚叾姣忎竴涓〃欏規槸璇ョ被鐨勮櫄鍑芥暟鍦板潃銆?br>2銆佸湪瀹氫箟璇ユ淳鐢熺被瀵硅薄鏃訛紝鍏堣皟鐢ㄥ叾鍩虹被鐨勬瀯閫犲嚱鏁幫紝鐒跺悗鍐嶅垵濮嬪寲VPTR錛屾渶鍚庡啀璋冪敤媧劇敓綾葷殑鏋勯犲嚱鏁幫紙 浠庝簩榪涘埗鐨勮閲庢潵鐪嬶紝鎵璋撳熀綾誨瓙綾繪槸涓涓ぇ緇撴瀯浣擄紝鍏朵腑this鎸囬拡寮澶寸殑鍥涗釜瀛楄妭瀛樻斁铏氬嚱鏁拌〃澶存寚閽堛傛墽琛屽瓙綾葷殑鏋勯犲嚱鏁扮殑鏃跺欙紝棣栧厛璋冪敤鍩虹被鏋勯犲嚱 鏁幫紝this鎸囬拡浣滀負鍙傛暟錛屽湪鍩虹被鏋勯犲嚱鏁頒腑濉叆鍩虹被鐨剉ptr錛岀劧鍚庡洖鍒板瓙綾葷殑鏋勯犲嚱鏁幫紝濉叆瀛愮被鐨剉ptr錛岃鐩栧熀綾誨~鍏ョ殑vptr銆傚姝や互鏉ュ畬鎴? vptr鐨勫垵濮嬪寲銆?錛?br>3銆佸湪瀹炵幇鍔ㄦ佺粦瀹氭椂錛屼笉鑳界洿鎺ラ噰鐢ㄧ被瀵硅薄錛岃屼竴瀹氳閲囩敤鎸囬拡鎴栬呭紩鐢ㄣ傚洜涓洪噰鐢ㄧ被瀵硅薄浼犲兼柟寮忥紝鏈変復鏃跺熀綾誨璞$殑浜х敓錛岃岄噰鐢ㄦ寚閽堬紝鍒欐槸閫氳繃鎸囬拡鏉ヨ闂閮ㄧ殑媧劇敓綾誨璞$殑VPTR鏉ヨ揪鍒拌闂淳鐢熺被铏氬嚱鏁扮殑緇撴灉銆?

 VPTR 甯稿父浣嶄簬瀵硅薄鐨勫紑澶達紝緙栬瘧鍣ㄨ兘寰堝鏄撳湴鍙栧埌VPTR鐨勫鹼紝浠庤岀‘瀹歏TABLE鐨勪綅緗俈PTR鎬繪寚鍚慥TABLE鐨勫紑濮嬪湴鍧錛屾墍鏈夊熀綾誨拰瀹冪殑瀛愮被鐨勮櫄鍑? 鏁板湴鍧錛堝瓙綾昏嚜宸卞畾涔夌殑铏氬嚱鏁伴櫎澶栵級鍦╒TABLE涓瓨鍌ㄧ殑浣嶇疆鎬繪槸鐩稿悓鐨勶紝濡備笂闈ase綾誨拰derived綾葷殑VTABLE涓璿fun1鍜寁fun2 鐨勫湴鍧鎬繪槸鎸夌浉鍚岀殑欏哄簭瀛樺偍銆傜紪璇戝櫒鐭ラ亾vfun1浣嶄簬VPTR澶勶紝vfun2浣嶄簬VPTR+1澶勶紝鍥犳鍦ㄧ敤鍩虹被鎸囬拡璋冪敤铏氬嚱鏁版椂錛岀紪璇戝櫒棣栧厛鑾峰彇鎸囬拡鎸? 鍚戝璞$殑綾誨瀷淇℃伅錛圴PTR錛夛紝鐒跺悗灝卞幓璋冪敤铏氬嚱鏁般傚涓涓猙ase綾繪寚閽坧Base鎸囧悜浜嗕竴涓猟erived瀵硅薄錛岄偅pBase->vfun2 ()琚紪璇戝櫒緲昏瘧涓?nbsp;VPTR+1 鐨勮皟鐢紝鍥犱負铏氬嚱鏁皏fun2鐨勫湴鍧鍦╒TABLE涓綅浜庣儲寮曚負1鐨勪綅緗笂銆傚悓鐞嗭紝pBase->vfun3 ()琚紪璇戝櫒緲昏瘧涓?nbsp;VPTR+2鐨勮皟鐢ㄣ傝繖灝辨槸鎵璋撶殑鏅氱粦瀹氥?/p>

 鎴戜滑鏉ョ湅涓涓嬭櫄鍑芥暟璋冪敤鐨勬眹緙栦唬鐮侊紝浠ュ姞娣辯悊瑙c?/p>

 void test(base* pBase)
 {
  pBase->vfun2();
 }

 int main(int argc, char* argv[])
 {
  derived td;
  

 
  test(&td);
  
  return 0;
 }

 derived td;緙栬瘧鐢熸垚鐨勬眹緙栦唬鐮佸涓嬶細
  mov DWORD PTR _td$[esp+24], OFFSET FLAT:??_7derived@@6B@ ; derived::`vftable'
  鐢辯紪璇戝櫒鐨勬敞閲婂彲鐭ワ紝姝ゆ椂PTR _td$[esp+24]涓瓨鍌ㄧ殑灝辨槸derived綾葷殑VTABLE鍦板潃銆?br>  
 test(&td);緙栬瘧鐢熸垚鐨勬眹緙栦唬鐮佸涓嬶細
  lea eax, DWORD PTR _td$[esp+24]    
  mov DWORD PTR __$EHRec$[esp+32], 0
  push eax
  call ?test@@YAXPAVbase@@@Z   ; test 
  璋冪敤test鍑芥暟鏃跺畬鎴愪簡濡備笅宸ヤ綔錛氬彇瀵硅薄td鐨勫湴鍧錛屽皢鍏跺帇鏍堬紝鐒跺悗璋冪敤test銆?/p>

 pBase->vfun2();緙栬瘧鐢熸垚鐨勬眹緙栦唬鐮佸涓嬶細
   mov ecx, DWORD PTR _pBase$[esp-4]
  mov eax, DWORD PTR [ecx]
  jmp DWORD PTR [eax+4]
   棣栧厛浠庢爤涓彇鍑簆Base鎸囬拡鎸囧悜鐨勫璞″湴鍧璧嬬粰ecx錛岀劧鍚庡彇瀵硅薄寮澶寸殑鎸囬拡鍙橀噺涓殑鍦板潃璧嬬粰eax錛屾鏃秂ax鐨勫煎嵆涓篤PTR鐨勫鹼紝涔熷氨鏄? VTABLE鐨勫湴鍧銆傛渶鍚庡氨鏄皟鐢ㄨ櫄鍑芥暟浜嗭紝鐢變簬vfun2浣嶄簬VTABLE鐨勭浜屼釜浣嶇疆錛岀浉褰撲簬 VPTR+1錛屾瘡涓嚱鏁版寚閽堟槸4涓瓧鑺傞暱錛屾墍浠ユ渶鍚庣殑 璋冪敤琚紪璇戝櫒緲昏瘧涓?nbsp;jmp DWORD PTR [eax+4]銆傚鏋滄槸璋冪敤pBase->vfun1()錛岃繖鍙ュ氨璇ヨ緙栬瘧涓? jmp DWORD PTR [eax]銆?br>  

 鐜板湪搴旇瀵瑰鎬併佽櫄鍑芥暟銆佹櫄緇戝畾鏈夋瘮杈冩竻妤氱殑浜嗚В浜嗗惂銆?br> 

杞創錛歨ttp://blog.csdn.net/shenmea00000/archive/2007/10/31/1859762.aspx

鍛ㄥ己 2011-05-11 14:13 鍙戣〃璇勮
]]>
c++璁捐妯″紡錛堜節錛?鎶借薄宸ュ巶錛圓bstract Factory錛?/title><link>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145613.html</link><dc:creator>鍛ㄥ己</dc:creator><author>鍛ㄥ己</author><pubDate>Tue, 03 May 2011 15:40:00 GMT</pubDate><guid>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145613.html</guid><wfw:comment>http://m.shnenglu.com/tankzhouqiang/comments/145613.html</wfw:comment><comments>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145613.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tankzhouqiang/services/trackbacks/145613.html</trackback:ping><description><![CDATA[      鎶借薄宸ュ巶(Abstract Factory)妯″紡鐪嬭搗鏉ュ拰鍓嶉潰鐪嬪埌鐨勫伐鍘傛柟娉曞緢鐩鎬技錛屽彧鏄畠浣跨敤鑻ュ共宸ュ巶鏂規硶(Factory Method錛夋ā寮忋傛瘡涓伐鍘傛柟娉曟ā寮忓垱寤轟竴涓笉鍚岀被鍨嬬殑瀵硅薄銆傚綋鍒涘緩涓涓伐鍘傚璞℃椂錛岃鍐沖畾灝嗗浣曚嬌鐢ㄧ敱閭d釜宸ュ巶鍒涘緩鐨勬墍鏈夊璞°傜ず渚嬩唬鐮佸涓嬶紙鍋囪瑕佸垱寤轟竴涓氱敤鐨勬父鎴忕幆澧冿紝騫朵笖甯屾湜瀹冭兘鏀寔涓嶅悓綾誨瀷鐨勬父鎴忥級錛?br>#include<iostream><br>using namespace std;<br><br>class Obstacle<br>{<br>public:<br>    virtual void action()=0;<br>};<br><br>class Player<br>{<br>public:<br>    virtual void interactWith(Obstacle*)=0;<br>};<br><br>class Kitty: public Player<br>{<br>    virtual void interactWith(Obstacle *ob)<br>    {<br>        cout<<"Kitty has encountered a";<br>        ob->action();<br>    }<br>};<br><br>class KungFuGuy: public Player<br>{<br>    virtual void interactWith(Obstacle* ob)<br>    {<br>        cout<<"KungFuGuy now battles against a";<br>        ob->action();<br>    }<br>};<br>class Puzzle: public Obstacle<br>{<br>public:<br>    void action(){cout<<"Puzzle"<<endl;}<br>};<br><br>class NastyWeapon: public Obstacle<br>{<br>public:<br>    void action(){cout<<"NastyWeapon"<<endl;}<br>};<br><br>//the abstract factory<br>class GameElementFactory<br>{<br>public:<br>    virtual Player* makePlayer()=0;<br>    virtual Obstacle* makeObstacle()=0;<br>};<br><br>//concreate factories<br>class KittiesAndPuzzles:public GameElementFactory<br>{<br>public:<br>    virtual Player* makePlayer(){return new Kitty;}<br>    virtual Obstacle * makeObstacle(){return new Puzzle;}<br>};<br><br>class KillAndDismember:public GameElementFactory<br>{<br>public:<br>    virtual Player* makePlayer(){return new KungFuGuy;}<br>    virtual Obstacle *makeObstacle(){return new NastyWeapon;}<br>};<br><br><br>class GameEnvironment<br>{<br>    GameElementFactory* gef;<br>    Player* p;<br>    Obstacle *ob;<br>public:<br>    GameEnvironment(GameElementFactory * factory)<br>        :gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle()){}<br>    void play(){p->interactWith(ob);}<br>    ~GameEnvironment()<br>    {<br>        delete p;<br>        delete ob;<br>        delete gef;<br>    }<br>};<br><br>int main()<br>{<br>    GameEnvironment<br>        g1(new KittiesAndPuzzles),<br>        g2(new KillAndDismember);<br>    g1.play();<br>    g2.play();<br>}<br><br>鍦ㄦ鐜涓紝Player瀵硅薄涓嶰bstacle 瀵硅薄浜や簰錛屼絾鏄疨layer鍜孫bstacle綾誨瀷渚濊禆浜庡叿浣撶殑娓告垙銆傚彲浠ラ夋嫨鐗瑰畾鐨凣ameElementFactory鏉ュ喅瀹氭父鎴忕殑綾誨瀷錛岀劧鍚嶨ameEnvironment鎺у埗娓告垙鐨勮緗拰榪涜銆傚湪鏈緥涓紝娓告垙鐨勮緗拰榪涜寰堢畝鍗曪紝浣嗘槸閭d簺鍔ㄤ綔鍦ㄥ緢澶х▼搴︿笂鍐沖畾浜嗘父鎴忕殑緇撴灉銆?br><br><img src ="http://m.shnenglu.com/tankzhouqiang/aggbug/145613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tankzhouqiang/" target="_blank">鍛ㄥ己</a> 2011-05-03 23:40 <a href="http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145613.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>c++璁捐妯″紡錛堝叓錛?宸ュ巶妯″紡錛氬皝瑁呭璞$殑鍒涘緩http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145610.html鍛ㄥ己鍛ㄥ己Tue, 03 May 2011 15:12:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145610.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145610.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145610.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145610.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145610.html鐨勫伐鍘傛柟娉曟ā寮忕殑涓縐嶅彉浣撱傜敱浜庢瘡涓潰鍚戝璞″簲鐢ㄧ▼搴忛兘闇瑕佸垱寤哄璞★紝騫朵笖鐢變簬浜轟滑鍙兘閫氳繃娣誨姞鏂扮被鍨嬫潵鎵╁睍搴旂敤紼嬪簭錛屽伐鍘傛ā寮忓彲鑳芥槸鎵鏈夎璁℃ā寮忎腑鏈鏈夌敤鐨勬ā寮忎箣涓銆傚疄鐜板伐鍘傛ā寮忕殑涓縐嶆柟娉曞氨鏄湪鍩虹被涓畾涔変竴涓潤鎬佹垚鍛樺嚱鏁幫紝紺轟緥濡備笅錛?br>#include<iostream>
#include<stdexcept>
#include<cstddef>
#include<string>
#include<vector>

using namespace std;

class Shape
{
public:
    virtual void draw()=0;
    virtual void erase()=0;
    virtual ~Shape(){}
    class BadShapeCreation :public logic_error
    {
    public:
        BadShapeCreation(string type):
            logic_error("Cannot create type"+type){}
    };
    static Shape* factory(const string &type)
        throw(BadShapeCreation);
};

class Circle:public Shape
{
    Circle(){}
    friend class Shape;
public:
    void draw(){cout<<"Circle::draw"<<endl;}
    void erase(){cout<<"Circle::erase"<<endl;}
    ~Circle(){cout<<"Circle::~Circle"<<endl;}
};

class Square:public Shape
{
    Square(){}
    friend class Shape;
public:
    void draw(){cout<<"Square::draw"<<endl;}
    void erase(){cout<<"Square::erase"<<endl;}
    ~Square(){cout<<"Square::~Square"<<endl;}
};

Shape *Shape::factory(const string & type)
    throw(Shape::BadShapeCreation)
{
    if(type=="Circle")return new Circle;
    if(type=="Square")return new Square;
    throw BadShapeCreation(type);
}

char *sl[]={"Circle","Square","Square","Circle","Circle","Circle","Square"};

int main()
{
    vector<Shape*>shapes;
    try{
        for(size_t i=0;i<sizeof sl/sizeof sl[0];i++)
            shapes.push_back(Shape::factory(sl[i]));
    }catch(Shape::BadShapeCreation e)
    {
        cout<<e.what()<<endl;
        return -1;
    }
    for(size_t i=0;i<shapes.size();i++)
    {
        shapes[i]->draw();
        shapes[i]->erase();
    }
}

鍑芥暟factory 鍏佽浠ヤ竴涓弬鏁版潵鍐沖畾鍒涘緩浣曠綾誨瀷鐨凷hape銆傚湪榪欓噷錛屽弬鏁扮被鍨嬩負string,涔熷彲浠ユ槸浠諱綍鏁版嵁闆嗐備負浜嗙‘淇濆璞$殑鍒涘緩鍙兘鍙戠敓鍦ㄥ嚱鏁癴actory()涓紝Shape鐨勭壒瀹氱被鍨嬬殑鏋勯犲嚱鏁拌璁句負縐佹湁錛屽悓鏃禨hape琚0鏄庝負鍙嬪厓綾伙紝鍥犳factory()鑳藉璁塊棶榪欎簺鏋勯犲嚱鏁般?br>
鍙傝冿細 C++緙栫▼鎬濇兂鍗?



鍛ㄥ己 2011-05-03 23:12 鍙戣〃璇勮
]]>
c++璁捐妯″紡錛堜竷錛?鑱岃矗閾炬ā寮忥細灝濊瘯閲囩敤涓緋誨垪絳栫暐妯″紡http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145561.html鍛ㄥ己鍛ㄥ己Tue, 03 May 2011 06:01:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145561.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145561.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145561.html#Feedback1http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145561.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145561.html     闄や簡璋冪敤涓涓嚱鏁版潵婊¤凍鏌愪釜璇鋒眰浠ュ錛岄摼涓殑澶氫釜鍑芥暟閮芥湁姝ゆ満浼氭弧瓚蟲煇涓姹傦紝鍥犳瀹冩湁鐐逛笓瀹剁郴緇熺殑鎰忓懗銆傜敱浜庤亴璐i摼瀹為檯涓婂氨鏄竴涓摼琛紝瀹冭兘澶熷姩鎬佸垱寤猴紝鍥犳瀹冨彲浠ョ湅鍋氭槸涓涓洿涓鑸殑鍔ㄦ佹瀯寤虹殑switch璇彞銆傜ず渚嬩唬鐮佸涓嬶細
#include<iostream>
#include<vector>

using namespace std;


enum Answer{NO,YES};

class GimmeStrategy
{
    public:
        virtual Answer canIHave()=0;
        virtual ~GimmeStrategy(){}
};

class AskMom: public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Moom? can I have this?"<<endl;
            return NO;
        }
};

class AskDad: public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Dad,I really need this!"<<endl;
            return NO;
        }
};


class AskGrandpa:public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Grandpa , is it my birthday yet?"<<endl;
            return NO;
        }
};

class AskGrandma:public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Grandma,I really love you!"<<endl;
            return YES;
        }
};

class Gimme:public GimmeStrategy
{
    vector<GimmeStrategy*>chain;
    public:
        Gimme(){
            chain.push_back(new AskMom());
            chain.push_back(new AskDad());
            chain.push_back(new AskGrandpa());
            chain.push_back(new AskGrandma());
        }
        Answer canIHave()
        {
            vector<GimmeStrategy*>::iterator it=chain.begin();
            while(it!=chain.end())
                if((*it++)->canIHave()==YES)
                    return YES;
            cout<<"whiiiiiinnne!"<<endl;
            return NO;
        }
        ~Gimme(){};
};

int main()
{
    Gimme chain;
    chain.canIHave();
}


鍙傝?錛歝++緙栫▼鎬濇兂鍗蜂簩



鍛ㄥ己 2011-05-03 14:01 鍙戣〃璇勮
]]>
c++璁捐妯″紡錛堝叚錛夌瓥鐣ユā寮忥細榪愯鏃墮夋嫨綆楁硶http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145541.html鍛ㄥ己鍛ㄥ己Tue, 03 May 2011 03:33:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145541.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145541.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145541.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145541.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145541.html       “絳栫暐“鐨勬剰鎬濆氨鏄細鍙互浣跨敤澶氱鏂規硶鏉ヨВ鍐蟲煇涓棶棰橈紝鍗蟲潯鏉″ぇ闄嗛氱綏椹傜幇鍦ㄨ冭檻涓涓嬪繕璁頒簡鏌愪釜浜哄鍚嶆椂鐨勬儏鏅傝繖閲岀殑紼嬪簭鍙互鐢ㄤ笉鍚屾柟娉曡В鍐寵繖涓棶棰橈紝瀹炰緥浠g爜濡備笅錛?br>#include<iostream>

using namespace std;

class NameStrategy
{
    public:
        virtual void greet()=0;
};

class SayHi: public NameStrategy
{
    public:
        void greet()
        {
            cout<<"Hi! How's it going?"<<endl;
        }
};

class Ignore: public NameStrategy
{
    public:
        void greet()
        {
            cout<<"Pretend I don't see you)"<<endl;
        }
};

class Admission:public NameStrategy
{
    public:
        void greet()
        {
            cout<<"I'm sorry ,I forgot your name."<<endl;
        }
};

class Context
{
    NameStrategy & strategy;
    public:
        Context(NameStrategy & strat):strategy(strat){}
        void greet(){strategy.greet();}
};


int main()
{
    SayHi sayhi;
    Ignore ignore;
    Admission admission;
    Context c1(sayhi),c2(ignore),c3(admission);
    c1.greet();
    c2.greet();
    c3.greet();

}

Context::greet()鍙互姝h鍦板啓寰楁洿鍔犲鏉備簺錛屽畠綾諱技妯℃澘鏂規硶妯″紡錛屽洜涓哄叾涓寘鍚簡涓嶈兘鏀瑰彉鐨勪唬鐮併備絾鍦ㄥ嚱鏁癿ain()涓彲浠ョ湅鍒幫紝鍙互鍦ㄨ繍琛屾椂灝辯瓥鐣ヨ繘琛岄夋嫨銆傛洿榪涗竴姝ョ殑鍋氭硶銆傚彲浠ュ皢鐘舵佹ā寮忎笌Context瀵硅薄鐨勭敓瀛樻湡闂村彉鍖栫殑絳栫暐妯″紡緇撳悎璧鋒潵浣跨敤銆?br>


鍛ㄥ己 2011-05-03 11:33 鍙戣〃璇勮
]]>
c++璁捐妯″紡錛堜簲錛夋ā鏉挎柟娉曟ā寮?/title><link>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145537.html</link><dc:creator>鍛ㄥ己</dc:creator><author>鍛ㄥ己</author><pubDate>Tue, 03 May 2011 03:15:00 GMT</pubDate><guid>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145537.html</guid><wfw:comment>http://m.shnenglu.com/tankzhouqiang/comments/145537.html</wfw:comment><comments>http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145537.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/tankzhouqiang/services/trackbacks/145537.html</trackback:ping><description><![CDATA[       搴旂敤紼嬪簭緇撴瀯妗嗘灦鍏佽浠庝竴涓垨涓緇勭被涓戶鎵夸互渚垮垱寤轟竴涓柊鐨勫簲鐢ㄧ▼搴忥紝閲嶇敤鐜板瓨綾諱腑鍑犱箮鎵鏈夌殑浠g爜錛屽茍涓旇鐩栧叾涓竴涓垨澶氫釜鍑芥暟浠ヤ究鑷畾涔夋墍闇瑕佺殑搴旂敤紼嬪簭銆傚簲鐢ㄧ▼搴忕粨鏋勬鏋朵腑鐨勪竴涓熀鏈殑姒傚康鏄ā鏉挎柟娉曟ā寮忥紝瀹冨緢鍏稿瀷鍦伴殣钘忓湪瑕嗙洊鐨勪笅鏂癸紝閫氳繃璋冪敤鍩虹被鐨勪笉鍚屽嚱鏁版潵椹卞姩紼嬪簭榪愯銆?br>      妯℃澘鏂規硶妯″紡鐨勪竴涓噸瑕佺壒寰佹槸瀹冪殑瀹氫箟鍦ㄥ熀綾諱腑錛堟湁鏃朵綔涓轟竴涓鏈夋垚鍛樺嚱鏁幫級騫朵笖涓嶈兘鏀瑰姩錛屾ā鏉挎柟娉曟ā寮忓氨鏄?#8220;鍧氭寔鐩稿悓鐨勪唬鐮?#8220;銆傚畠璋冪敤鍏朵粬鍩虹被鍑芥暟錛堝氨鏄偅浜涜瑕嗙洊鐨勫嚱鏁幫級浠ヤ究瀹屾垚鍏跺伐浣滐紝浣嗘槸瀹㈡埛紼嬪簭鍛樹笉蹇呯洿鎺ヨ皟鐢ㄨ繖浜涘嚱鏁般傞┍鍔ㄥ簲鐢ㄧ▼搴忚繍琛岀殑“寮曟搸”鏄ā鏉挎柟娉曟ā寮忥紝紺轟緥浠g爜濡備笅錛?br>#include<iostream><br><br>using namespace std;<br><br>class ApplicationFramework<br>{<br>    protected :<br>        virtual void customize1()=0;<br>        virtual void customize2()=0;<br>    public:<br>        void templateMethod()<br>        {<br>            for(int i=0;i<5;i++)<br>            {<br>                customize1();<br>                customize2();<br>            }<br>        }<br>};<br><br>class MyApp: public ApplicationFramework<br>{<br>    protected:<br>        void customize1(){cout<<"Hello";}<br>        void customize2(){cout<<"World!"<<endl;}<br>};<br><br>int main()<br>{<br>    MyApp app;<br>    app.templateMethod();<br><br>}<br><br>鍙傝冿細c++緙栫▼鎬濇兂鍗蜂簩<br><br><img src ="http://m.shnenglu.com/tankzhouqiang/aggbug/145537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/tankzhouqiang/" target="_blank">鍛ㄥ己</a> 2011-05-03 11:15 <a href="http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145537.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>c++璁捐妯″紡錛堝洓錛夐傞厤鍣?Adapter)妯″紡http://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145534.html鍛ㄥ己鍛ㄥ己Tue, 03 May 2011 02:49:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145534.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145534.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/05/03/145534.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145534.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145534.html
瀹炰緥浠g爜濡備笅錛?br>//FibonacciGenerator.h, 鏂愭嘗閭e鏁板垪浜х敓鍣ㄧ被

#ifndef FIBONACCIGENERATOR_H
#define FIBONACCIGENERATOR_H

class FibonacciGenerator
{
    int n;
    int val[2];
    public:
        FibonacciGenerator():n(0){val[0]=val[1]=0;}
        int operator()()
        {
            int result=n>2?val[0]+val[1]:n>0?1:0;
            ++n;
            val[0]=val[1];
            val[1]=result;
            return result;
        }
        int count(){return n;}
};
#endif

涔熻璇昏呭笇鏈涘埄鐢ㄨ繖涓駭鐢熷櫒鏉ユ墽琛孲TL鏁板肩畻娉曟搷浣溿傞仐鎲劇殑鏄紝STL綆楁硶鍙兘浣跨敤榪唬鍣ㄦ墠鑳藉伐浣滐紝榪欏氨瀛樺湪鎺ュ彛涓嶅尮閰嶇殑闂銆傝В鍐蟲柟娉曞氨鏄駭鐢熶竴涓傞厤鍣ㄣ備唬鐮佸涓嬨?br>#include<iostream>
#include<numeric>
#include"FibonacciGenerator.h"

using namespace std;

class FibonacciAdapter
{
    FibonacciGenerator f;
    int length;
    public:
        FibonacciAdapter(int size):length(size){}
        class iterator;
        friend class iterator;
        class iterator:public std::iterator<std::input_iterator_tag,FibonacciAdapter,ptrdiff_t>
        {
            FibonacciAdapter& ap;
            public:
                typedef int value_type;
                iterator(FibonacciAdapter &a):ap(a){}
                bool operator==(const iterator &)const{
                    return ap.f.count()==ap.length;
                }
                bool operator!=(const iterator &x)const
                {
                    return !(*this==x);
                }

                int operator*()const{return ap.f();}
                iterator& operator++(){return *this;}
                iterator operator++(int){return *this;}
        };
        iterator begin(){return iterator(*this);}
        iterator end(){return iterator(*this);}
};

int main()
{
    const int SZ=20;
    FibonacciAdapter a1(SZ);
    cout<<"accumulate:"<<accumulate(a1.begin(),a1.end(),0)<<endl;
}





鍛ㄥ己 2011-05-03 10:49 鍙戣〃璇勮
]]>
c++璁捐妯″紡(涓?浠g悊妯″紡錛圥roxy錛変笌鐘舵佹ā寮?State)妯″紡http://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145229.html鍛ㄥ己鍛ㄥ己Thu, 28 Apr 2011 08:04:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145229.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145229.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145229.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145229.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145229.html      鍩烘湰鎬濇兂寰堢畝鍗曪細浠g悊綾繪淳鐢熸潵鑷竴涓熀綾伙紝鐢卞鉤琛屽湴媧劇敓鏉ヨ嚜鍚屼竴涓熀綾葷殑涓涓垨澶氫釜綾繪彁渚涘疄闄呯殑瀹炵幇銆傚綋涓涓唬鐞嗗璞¤鍒涘緩鐨勬椂鍊欙紝涓涓疄鐜板璞″氨鍒嗛厤緇欎簡瀹冿紝浠g悊瀵硅薄灝卞皢鍑芥暟璋冪敤鍙戠粰瀹炵幇瀵硅薄銆?br>      浠庣粨鏋勪笂鏉ョ湅錛屼唬鐞嗘ā寮忓拰鐘舵佹ā寮忕殑鍖哄埆寰堢畝鍗曪細浠g悊妯″紡鍙湁涓涓疄鐜扮被錛岃岀姸鎬佹ā寮忔湁澶氫釜錛堜竴涓互涓婏級瀹炵幇銆傝涓鴻繖涓ょ璁捐妯″紡鐨勫簲鐢ㄤ篃涓嶅悓錛氫唬鐞嗘ā寮忔帶鍒跺鍏跺疄鐜扮被鐨勮闂紝鑰岀姸鎬佹ā寮忓姩鎬佸湴鏀瑰彉鍏跺疄鐜扮被銆?br>錛?錛変唬鐞嗘ā寮忎緥瀛愶細
#include<iostream>

using namespace std;

class ProxyBase
{
    public:
        virtual void f()=0;
        virtual void g()=0;
        virtual void h()=0;
        virtual ~ProxyBase(){}
};


class Implementation :public ProxyBase
{
    public:
        void f(){cout<<"Implementation.f()"<<endl;}
        void g(){cout<<"Implementation.g()"<<endl;}
        void h(){cout<<"Implementation.h()"<<endl;}
};


class Proxy: public ProxyBase
{
    ProxyBase *implementation;
    public:
        Proxy(){implementation=new Implementation();}
        ~Proxy(){delete implementation;}


        void f(){implementation->f();}
        void g(){implementation->g();}
        void h(){implementation->h();}
};

int main()
{
    Proxy p;
    p.f();
    p.g();
    p.h();
}

錛?錛夌姸鎬佹ā寮?br>#include<iostream>

using namespace std;

class Creature
{
    class State
    {
        public:
            virtual string response()=0;
    };

    class Frog : public State
    {
        public:
            string response(){return "Ribbet!";}
    };

    class Prince:public State
    {
        public:
            string response(){return "Darling!";}
    };

    State *state;
    public:
        Creature(): state(new Frog()){}
        void greet()
        {
            cout<<state->response()<<endl;
        }
        void kiss()
        {
            delete state;
            state=new Prince();
        }
};


int main()
{
    Creature creature;
    creature.greet();
    creature.kiss();
    creature.greet();
}



鍛ㄥ己 2011-04-28 16:04 鍙戣〃璇勮
]]>
c++璁捐妯″紡( 浜岋級 鍛戒護錛氶夋嫨鎿嶄綔http://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145212.html鍛ㄥ己鍛ㄥ己Thu, 28 Apr 2011 06:26:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145212.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145212.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145212.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145212.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145212.html#include<iostream>
#include<vector>

using namespace std;

class Command
{
    public:
        virtual void execute()=0;
};


class Hello: public Command
{
    public:
        void execute(){cout<<"hello ";}
};


class World : public Command
{
    public:
        void execute(){cout<<"world!";}
};

class IAm:public Command
{
    public:
        void execute(){cout<<"I'm the command pattern!";}
};

class Macro
{
    vector<Command *>commands;
    public:
        void add(Command *c){commands.push_back(c);}
        void run()
        {
            vector<Command*>::iterator it=commands.begin();
            while(it!=commands.end())
            {
                (*it++)->execute();
                cout<<endl;
            }
            
        }
};


int main()
{
    Macro macro;
    macro.add(new Hello);
    macro.add(new World);
    macro.add(new IAm);
    macro.run();
}

      鍛戒護妯″紡鐨勪富瑕佺壒鐐規槸鍏佽鍚戜竴涓嚱鏁版垨鑰呭璞′紶閫掍竴涓兂瑕佺殑鍔ㄤ綔銆備笂榪頒緥瀛愭彁渚涗簡灝嗕竴緋誨垪闇瑕佷竴璧鋒墽琛岀殑鍔ㄤ綔闆嗚繘琛屾帓闃熺殑鏂規硶銆傚湪榪欓噷錛屽彲浠ュ姩鎬佸垱寤烘柊鐨勮涓猴紝鏌愪簺浜嬫儏閫氬父鍙兘閫氳繃緙栧啓鏂扮殑浠g爜鏉ュ畬鎴愶紝鑰屽湪涓婅堪渚嬪瓙涓彲浠ラ氳繃瑙i噴涓涓剼鏈潵瀹炵幇銆?br>
鍙傝冿細c++緙栫▼鎬濇兂2



鍛ㄥ己 2011-04-28 14:26 鍙戣〃璇勮
]]>
c++璁捐妯″紡錛堜竴錛?鍗曚歡錛圫ingleton)http://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145192.html鍛ㄥ己鍛ㄥ己Thu, 28 Apr 2011 02:41:00 GMThttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145192.htmlhttp://m.shnenglu.com/tankzhouqiang/comments/145192.htmlhttp://m.shnenglu.com/tankzhouqiang/archive/2011/04/28/145192.html#Feedback0http://m.shnenglu.com/tankzhouqiang/comments/commentRss/145192.htmlhttp://m.shnenglu.com/tankzhouqiang/services/trackbacks/145192.html
鍗曚歡涔熻鏄渶綆鍗曠殑璁捐妯″紡錛屽畠鏄厑璁鎬竴涓被鏈変笖浠呮湁涓涓疄渚嬬殑鏂規硶銆傚垱寤轟竴涓崟浠舵ā寮忕殑鍏抽敭鏄槻姝㈠鎴風▼搴忓憳鑾峰緱浠諱綍鎺у埗鍏跺璞$敓瀛樻湡鐨勬潈鍒┿備負浜嗗仛鍒拌繖涓鐐癸紝澹版槑鎵鏈夌殑鏋勯犲嚱鏁頒負縐佹湁錛屽茍涓旈槻姝㈢紪璇戝櫒闅愬紡鐢熸垚浠諱綍鏋勯犲嚱鏁般傛敞鎰忥紝鎷瘋礉鏋勯犲嚱鏁板拰璧嬪兼搷浣滅錛堣繖涓や釜鏁呮剰娌℃湁瀹炵幇錛岋紝鍥犱負瀹冧滑鏍規湰涓嶄細琚皟鐢級琚0鏄庝負縐佹湁錛屼互渚塊槻姝換浣曡繖綾誨鍒跺姩浣滀駭鐢熴傝繖縐嶆柟娉曞茍娌℃湁闄愬埗鍙垱寤轟竴涓璞°傝繖縐嶆妧鏈篃鏀寔鍒涘緩鏈夐檺涓璞$殑瀵硅薄姹犮?br>
涓嬮潰鐨勭▼搴忔樉紺哄湪c++涓浣曞疄鐜頒竴涓崟浠舵ā寮?br>#include<iostream>

using namespace std;


class Singleton
{
    static Singleton s;
    int i;
    Singleton(int x):i(x){}
    Singleton & operator=(Singleton &); //disallowed
    Singleton(const Singleton &);

public:
    static Singleton & instance(){return s;}
    int getValue(){return i;}
    void setValue(int x){i=x;}
};


Singleton Singleton::s(47);


int main()
{
    Singleton &s =Singleton::instance();
    cout<<s.getValue()<<endl;
    Singleton &s2=Singleton::instance();
    s2.setValue(9);
    cout<<s.getValue()<<endl;
}


鍙傝冿細c++ 緙栫▼鎬濇兂 2



鍛ㄥ己 2011-04-28 10:41 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            噜噜噜91成人网| 亚洲人成高清| 久久一区二区三区国产精品| 先锋资源久久| 久久国产精品免费一区| 欧美一区二区视频在线观看2020 | 亚洲一区免费网站| 久久综合久久久久88| 另类酷文…触手系列精品集v1小说| 国产精品wwwwww| 欧美日韩一区二区三区在线看 | 国产精品视频免费| 欧美日韩一区二区三区高清| 欧美三级欧美一级| 国产欧美日韩免费| 亚洲国产精品成人综合| 一区二区三区日韩精品视频| 香蕉成人久久| 麻豆国产精品777777在线 | 国内精品视频在线播放| 在线观看欧美一区| 亚洲一区尤物| 免费视频一区| 亚洲视频日本| 久久久久久一区| 欧美日韩三级一区二区| 一区二区亚洲精品国产| 欧美一区三区三区高中清蜜桃 | 免费不卡在线视频| 久久免费视频观看| 欧美午夜久久| 136国产福利精品导航网址| 亚洲视频大全| 亚洲成色最大综合在线| 一本一本久久| 麻豆成人精品| 黑人一区二区| 小黄鸭精品密入口导航| 91久久久久久久久久久久久| 欧美一区激情| 国产精品久久综合| 99国内精品久久| 免费视频一区| 久久精品国产亚洲aⅴ| 国产精品久久久久av免费| 亚洲精品资源美女情侣酒店| 麻豆久久久9性大片| 亚洲综合激情| 欧美系列精品| 亚洲一区二区三区免费视频| 亚洲黄网站黄| 美女福利精品视频| 伊人婷婷欧美激情| 久久综合中文色婷婷| 久久国产精品一区二区三区| 国产精品系列在线| 欧美在线免费播放| 午夜久久tv| 国产一区二区三区免费不卡| 久久国产精品高清| 欧美在线综合视频| 今天的高清视频免费播放成人 | 国产精品专区一| 亚洲午夜激情网页| 一区二区三区四区蜜桃| 欧美日韩国产在线观看| 一本大道久久a久久综合婷婷| 亚洲欧美高清| 亚洲一级二级| 国产精品一区久久久| 欧美中文在线观看| 久久精品国产欧美激情| 亚洲国产欧美日韩| 最新精品在线| 欧美性猛交xxxx乱大交蜜桃| 欧美在线网址| 久热综合在线亚洲精品| 一区二区欧美激情| 亚洲欧美另类久久久精品2019| 国产精品久久久久久久久免费樱桃 | 欧美精品 国产精品| 亚洲剧情一区二区| 亚洲色图综合久久| 好看的日韩av电影| 亚洲国产成人精品久久| 欧美日韩专区| 久久久久国色av免费观看性色| 亚洲激情婷婷| 欧美天天在线| 久久综合给合| 欧美日韩八区| 久久午夜羞羞影院免费观看| 欧美国产日韩视频| 先锋a资源在线看亚洲| 可以免费看不卡的av网站| 一区二区三区成人精品| 午夜精品剧场| 日韩午夜黄色| 久久国产精品一区二区| 日韩视频免费在线观看| 先锋影院在线亚洲| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲一区二区免费| 性一交一乱一区二区洋洋av| 亚洲激情电影在线| 亚洲欧美一区在线| 一本色道久久| 久久综合国产精品| 性色av一区二区怡红| 牛牛国产精品| 久久国产欧美精品| 欧美日韩一区在线观看| 女同性一区二区三区人了人一| 久久精品91久久香蕉加勒比| 99亚洲视频| 免费成人av在线看| 久久久欧美精品sm网站| 国产精品五月天| 一区二区三区不卡视频在线观看| 欧美国产一区在线| 久久久久久网| 国产精品自拍网站| 亚洲图片在区色| 亚洲欧美电影院| 欧美三级乱人伦电影| 亚洲美女在线视频| 日韩视频一区二区在线观看 | 欧美影院久久久| 亚洲精品资源| 免费永久网站黄欧美| 久久人人97超碰国产公开结果 | 蜜臀久久99精品久久久久久9| 国模精品一区二区三区色天香| 欧美专区亚洲专区| 国产精品地址| 亚洲午夜在线观看视频在线| 中文av一区二区| 欧美三级网址| 一本久久青青| 亚洲专区一区| 国产精品呻吟| 欧美一区二区三区四区在线| 久久riav二区三区| 国内精品久久久久久| 久久久久成人精品免费播放动漫| 亚洲国产影院| 久久亚洲午夜电影| 亚洲国产一区二区三区a毛片| 国产精品区免费视频| 中文欧美在线视频| 欧美在线1区| 国产在线观看91精品一区| 欧美在线一区二区| 欧美大片国产精品| 一本久道综合久久精品| 国产精品午夜春色av| 久久综合色一综合色88| 最新国产成人在线观看| 午夜一区在线| 亚洲电影欧美电影有声小说| 欧美大胆成人| 亚洲欧美影院| 欧美成人精品福利| 亚洲小说春色综合另类电影| 国产欧美日韩免费| 久久色在线播放| 日韩视频在线免费| 久久久噜噜噜久久人人看| 日韩亚洲不卡在线| 国产一本一道久久香蕉| 欧美黄网免费在线观看| 亚洲欧美日韩天堂| 亚洲国产精品热久久| 午夜久久久久| 亚洲卡通欧美制服中文| 国产日韩在线播放| 欧美极品在线观看| 久久精品国语| 国产欧美69| 亚洲国产女人aaa毛片在线| 欧美午夜不卡影院在线观看完整版免费 | 一区二区三区.www| 蜜桃视频一区| 午夜精品在线看| 日韩午夜激情av| 国产欧美日韩伦理| 欧美日韩情趣电影| 久久一区视频| 亚洲毛片视频| 久久精品1区| 99视频精品在线| 狼人天天伊人久久| 欧美一区二区三区婷婷月色 | 亚洲欧美成aⅴ人在线观看| 另类综合日韩欧美亚洲| 欧美黄色成人网| 久久久午夜视频| 午夜日韩av| 亚洲欧美日韩精品一区二区| 亚洲黄色毛片|