|
2017/7/21 ¤U¤È 01:45:52
¦³¤°»ò¤èªk¥i¥HÅý¤@ÓµêÀÀ¨ç¼Æ¡A¦b¨C¤@¼hÄ~©ÓÃþ§O³£»Ý¹ê§@
|
|
|
2017/7/21 ¤U¤È 02:42:33
¨S¦³¡AµêÀÀ¨ç¦¡¥un¦b¬Y¤@¼h¦³³Q¹ê°µ§Y¥i¡C °£«D©Ò¦³ªº¤l¥N³£¬O§A¦Û¤v°µªº¡A§_«h¦ü¥GµLªkºÊ±±²Ä¤TªÌ»s°µªº¨C¤@¼h¤l¥N¡C
|
|
|
2017/7/21 ¤U¤È 05:05:02
¬°¤°»ò¨S³o¥\¯à©O¡Hc++ À³¸Ó´£¨Ñ¤~¹ï§a¡A¦³¤°»òÃø¨¥¤§Áô¶Ü
|
|
|
2017/7/22 ¤W¤È 10:41:45
§Ú·Q¬O¦]¬°¨S¦³¥²n§a¡I ·íµM³o¬O¦Û¤vªº¸gÅç¡B¥[¤W¹ïC++ªº¤F¸Ñ¡B¦A¥[¤W¤@¨ÇÁr´úªº§PÂ_¡A¦Ü©ó¹ê»Ú¤Wªº¯u¹êì¦]¡H©Î¬O¬O§_¯u¦³¤°»òÃø¨¥¤§Áô¡H »¡¹ê¦b¡A§Ú¤]¤£¬OC++¼Ð·Ç©eû¡A§Ú¤]¤£½T©w¡C
»P¨äªÈµ²¦b³o¡A¤£¦p§A§i¶D§Ú̧A¬O¦b¤°»ò±¡¹Ò¤U¡B¤°»òÀ³¥Î³õ´º¤U·Qn¦³³o¼Ëªº¥\¯à¡H ¤]³\§Ṳ́ñ¸û¯à°÷µ¹¥X¹ê½èªº·N¨£¡A©Î¤]³\¯uªº¯à°÷©ú¥Õ³o¼Ëªº¥\¯àÀ³¦³¦s¦bªº¥²n¡C
|
|
|
2017/7/22 ¤U¤È 12:58:12
1. §Ú¼g¤F¤@ӥúüÀx¦s¾÷¨î¡A§Æ±æ¦U¼hªº¤l®]Ãþ§O¯à¹ê§@¤@ÓµêÀÀ¨ç¼Æ¦s¨ú¦Û¤vªº¸ê®Æ
2. °²³]§Ú¼g¤F¤@Ó class Base¡A§Æ±æ¥¦ªº²£¥Í¦Û¤vªº¤À¨¡A©Ò¥H¼g¤F¤@ÓµêÀÀ¨ç¼Æ virtual Base *Clone(); n¦U¼h¤l®]Ãþ§O³£n¹ê§@ new ¥X¦Û¤v
¥H¤W¨âÂI¬O§Ú¸I¹Lªº±¡ªp¡A¥u¯à¹D¼wÄU»¡¨Sªk±j¨în¹ê§@
|
|
|
2017/7/22 ¤U¤È 11:05:19
³o¼Ëªº¸Ü¡A¤£¬O¦³½Æ»s«Øºc¤l¥i¥H¥Î¶Ü¡H Á|¨Ò¨Ó»¡¡G
class Child : protected Base { public: Child(const Child &src) {...} };
³o¼Ë¡A·í§Ú»Ýn clone ªº®ÉÔ¡G
Child obj1; ... Child obj2(obj1); ©ÎªÌ¡G Child *obj3 = new Child(obj1);
|
|
|
2017/7/23 ¤W¤È 01:07:38
§Úªº·N«ä¬O³o¼Ë: class Prototype { public : Prototype(){} virtual ~Prototype(){}
virtual Prototype * Clone() = 0; };
|
|
|
2017/7/23 ¤U¤È 03:20:27
³o¼Ë§Ú©ú¥Õ§Aªº·N«ä¤F¡C ªº½T¡A¦b¦³¨Ç®ÉÔ·|»Ýn¨Ï¥Î°òÃþ½Æ»s¤lÃþ¹êÅé¡A¤ñ¦p»¡¦b¤£¨Ï¥Î¼Òª©ªº±¡ªp®L»s°µ®e¾¹ºÞ²z³q¥Îª«¥ó®É¡C ¤]½T¹ê°£¤F«Øºc¤l¥~¡A¡A¨S¦³¿ìªk±q»yªk¤Wn¨D¨C¤@¥N³£n«·s¹ê°µ¬YӨ禡¡C
¦ý¥t¤@¤è±¡A¤]¤£¤@©w©Ò¦³ªº¤l¥N³£n¹ê°µ clone ¨ç¦¡¡A¦]¬°¤£¨£±o¬Y¥NªºÃþ§O¤@©w¥i¥H²£¥Í¥X¦³·N¸qªº¹êÅé¡A¤ñ¦p»¡·í¥L¤]¬OÓµêÃþ®É¡C
|
|
|
2017/7/23 ¤U¤È 08:22:21
>¦ý¥t¤@¤è±¡A¤]¤£¤@©w©Ò¦³ªº¤l¥N³£n¹ê°µ clone ¨ç¦¡¡A¦]¬°¤£¨£±o¬Y¥NªºÃþ§O¤@©w¥i¥H²£¥Í¥X¦³·N¸qªº¹êÅé¡A¤ñ¦p»¡·í¥L¤]¬OÓµêÃþ®É¡C
³]pªº¥Øªº´N¬On¥Ñ¹êÅ骫¥ó§¹¥þ½Æ»s¡A©Ò¥H¤@©wn¹ê§@
|
|
|
2017/7/23 ¤U¤È 09:29:04
>³]pªº¥Øªº´N¬On¥Ñ¹êÅ骫¥ó§¹¥þ½Æ»s¡A©Ò¥H¤@©wn¹ê§@
¤ñ¦p»¡§Ú³]p¤F¤@Ó class Tiger¡An¯à°÷¶Ç¤J§Aªºµ{¦¡¨Ó¨ó°µ¡A¨º»ò¡G 1. Tiger ¥²¶·Ä~©Ó Base¡C 2. Tiger ¥²¶·¹ê°µ Clone ¨ç¦¡¡C
³o¬O¤wª¾ªº»Ý¨D¶µ¥Ø¡A³æY¦]³]p½t¬G§Úªº Tiger ¤£¬Oª½±µÄ~©Ó Base¡A¤¤¶¡ÁÙ¥d¤F¤ñ¤è»¡ Animal Ãþ§O¡C ¨º»ò¡AY Animal ¨ä¹ê¬OÓµêÃþ§O¡A¥¦¤´µM»Ýn¹ê°µ Clone ¶Ü¡H 1. Animal ¤£·|¦bµ{¦¡¤¤¥X²{¥ô¦óªºª½±µ¹êÅé¡A¦]¬°¥L¬OµêÃþ¡A©Ò¥H¦bµ{¦¡¤¤¤@©w¥u·|¥X²{ Animal ªº¤lÃþ¡C ¨º»ò¤lÃþ¥i¥H³B²z¦n¦Û¤vªº Clone ¤£´N¦n¤F¡H 2. §A¯unn¨D°µ¥X Animal ªº Clone¡A¥Ñ©ó Animal ¥»¨°÷©â¶H¡A¹ê¦b«ÜÃøª½±µ©w¸q¦Û¨ªº¹êÅé Clone ¤èªk¤º®e¡C ³Ì¦nªº°µªk´N¬O°µ¤@ӪŨ禡¥áµ¹¤lÃþ¦U¦Û·d©w¡A¨º©M¯dªÅ Clone ¦Ó¤£²z·|¦³®t¶Ü¡H
|
|
|
2017/7/24 ¤W¤È 05:44:06
Tiger ÁÙ¦³©µ¦ùÃþ§On«ç»ò¿ì
|
|
|
2017/7/28 ¤W¤È 04:49:47
°²³]¦³ÓÃöÁä¦r must ¥Î©óµêÀÀ¨ç¼Æ¡Aªí¥Ü¹ê§@Ãþ§O»Ýn¹ê§@¥X¨Ó¡A¦p¤UÃþ¦ü¡A¥u¬O¥H¤U¥u¯à¤@¼h¡A¦Ó must ¤£¼h¼Æ¡A¥un¬YÓÃþ§On§@¬°¹ê¨Òª«¥ó®É¡Aµo²{¶·n¹ê§@ªºµêÀÀ¨ç¼Æ¨S¹ê§@´N¥á¥X¿ù»~°T®§¡A¨âªÌ°µªk³£¤@¼Ë¡A§Þ³N¤W¨Ã¤£Ãø¡A¥u¬O¤£´£¨Ñ must ªº²z¥Ñ¬O¤°»ò
class Prototype { public : Prototype(){} virtual ~Prototype(){}
virtual Prototype * Clone() = 0; };
|
|
|
2017/7/28 ¤W¤È 09:03:12
¥ý»¡²{¹ê¡AC++ ¨Ã¤£´£¨Ñ§Anªº must¡B©ÎÃþ¦üÃöÁä¦rªº¤ä´©¡A³o¬OªÖ©wªº¡F ¦Ü©óì¦]¡H§Ú¤]¤£½T¹ê¤F¸Ñ¡A¤]³\¨ä¥Lª¾¹Dªº¤H¥i¥H¦^µª¡C
ºI¦Ü C++11 ¬°¤î(C++14 ÁÙ¨SªÅ¬ã¨s¡A¤£¹LÀ³¸Ó¤]®t¤£¦h)¡A¹ï©óÃþ§O»Ý¨ç¦¡ªº¨î±±¨î¥ÎÃöÁä¦r¥u¦³¨âÓ¡Goverride ©M final¡C ¤£¹L final è¦n©M§AnªºªF¦è¬Û¤Ï¡A¤@Ó³Q final ×¹¢ªºµê¨ç¦¡¬OµLªk¦b¤l¥N¦A³QÂмgªº¡I
|
|
|
2017/7/28 ¤W¤È 09:05:23
must ¥i¯à¸òÄ~©Óªº·§©À¦³ÂI½Ä¬ð§a ?
°²¦p Animal Ä~©Ó¤F Prototype ¦Ó¥B¹ê§@¤F Clone() ¨º Tiger Ä~©Ó¤F Animal «á, ¨ä¹ê´N¥u»Ýn°w¹ï»P Animal ¤£¦Pªº¦a¤è¥h§ï¼g, Ä~©Óªº·N¸q¤£´N¬O§Æ±æ code ¥i¥H leverage ¤÷Ãþ§O ?
¥t¥~°²¦p Tiger ªº Clone ¼g¦¨ Prototype * Tiger::Clone() { return Animal::Clone(); } §Y¨Ï¦³©w¸q must, ÁÙ¬OµLªk±j¨î¤lÃþ§O¥²¶·¹ê§@Äݩ󥦦ۤvªº Clone()
©Ò¥HÀ³¸Ó°Ý»¡, ·Q±j¢¤lÃþ§O¹ê§@¥Xþ¨Ç¤£¦P³B ?
|
|
|
2017/7/28 ¤U¤È 08:28:15
¦]¬° must Ãö©À¤W¸òÄ~©Ó·|¦³½Ä¬ð
Ä~©Ó¦³¤¶±»P¹ê§@ªºÄ~©Ó Prototype ¬OÅý¤HÄ~©Ó¤¶± =0 ´N¬On«OÃÒ§O¤H´£¨Ñ¹ê§@¡A ´£¨Ñ¹ê§@ªº¤H¡A«¥Î¤F¨Ì¾Ú Prototypye ©Ò¼¶¼gªºµ{¦¡½X ¡C ¦Ó Prototype ªº®]¤lÄ~©Ó¹ê§@¡A«¥Î¤F Prototype ªº«Ä¤l¡C
§Aªº must ¨î§O¤H«½Æ§Q¥Îµ{¦¡½Xªº½d³ò¡A°§C¥L«¥Îªº¦Û¥Ñ«×¡C
|
|
|
2017/7/28 ¤U¤È 08:34:16
>¤£¹L final è¦n©M§AnªºªF¦è¬Û¤Ï¡A¤@Ó³Q final ×¹¢ªºµê¨ç¦¡¬OµLªk¦b¤l¥N¦A³QÂмgªº¡I
©Ò¥H§Ú¤~ı±o©_©Ç¡Aªñ¦Ê¦~ªºµ{¦¡¾ú¥vÃø¥H¼Æpªºµ{¦¡½X¡A§Ú·QnªºªF¦èÀ³¦´N¦³¤H·Qn¤F¡AC++ ¤£´£¨ÑÀ³¦³Ó¦n²z¥Ñ§a
>must ¥i¯à¸òÄ~©Óªº·§©À¦³ÂI½Ä¬ð§a ?
¬Ý¤£¥X¦³¤°»ò½Ä¬ð
>°²¦p Animal Ä~©Ó¤F Prototype ¦Ó¥B¹ê§@¤F Clone() >¨º Tiger Ä~©Ó¤F Animal «á, ¨ä¹ê´N¥u»Ýn°w¹ï»P Animal ¤£¦Pªº¦a¤è¥h§ï¼g, Ä~©Óªº·N¸q¤£´N¬O§Æ±æ code ¥i¥H leverage ¤÷Ãþ§O ?
©Ò¥H¤£·|¦³½Ä¬ð°Ú¡AY¦hÓ must µ{¦¡¤£´N·|§ó°·§§
> >¥t¥~°²¦p Tiger ªº Clone ¼g¦¨ >Prototype * Tiger::Clone() >{ > return Animal::Clone(); >} >§Y¨Ï¦³©w¸q must, ÁÙ¬OµLªk±j¨î¤lÃþ§O¥²¶·¹ê§@Äݩ󥦦ۤvªº Clone()
§Y¨Ï¨S¦³ must¡A¤]¦³§A¤@¼Ëªº°ÝÃD¡A³o¬Oµ{¦¡ûªº°ÝÃD§a
>©Ò¥HÀ³¸Ó°Ý»¡, ·Q±j¢¤lÃþ§O¹ê§@¥Xþ¨Ç¤£¦P³B ?
¦]¬°¦³¥²n¡An½T©w¬YÓµêÀÀ¨ç¼Æ¤@©w·|³Q³Ì²×Ãþ§O¹ê§@ªº¶·n¡Aµ{¦¡ûn«ç»ò°µµLªk±±¨î¡A¤£¯à°µ¬°¤Ï¹ïªº²z¥Ñ
|
|
|
2017/7/28 ¤U¤È 08:41:18
>¦]¬° must Ãö©À¤W¸òÄ~©Ó·|¦³½Ä¬ð > >Ä~©Ó¦³¤¶±»P¹ê§@ªºÄ~©Ó >Prototype ¬OÅý¤HÄ~©Ó¤¶± =0 ´N¬On«OÃÒ§O¤H´£¨Ñ¹ê§@¡A >´£¨Ñ¹ê§@ªº¤H¡A«¥Î¤F¨Ì¾Ú Prototypye ©Ò¼¶¼gªºµ{¦¡½X ¡C >¦Ó Prototype ªº®]¤lÄ~©Ó¹ê§@¡A«¥Î¤F Prototype ªº«Ä¤l¡C > >§Aªº must ¨î§O¤H«½Æ§Q¥Îµ{¦¡½Xªº½d³ò¡A°§C¥L«¥Îªº¦Û¥Ñ«×¡C
§Ú must ªº·N«ä¬On³Ì²×Ãþ§O¶·¹ê§@©Î§ï¼g¥Îªº¡A¤£¶·³o»ò°µªº·íµM´N¤£À³¸Ó¨Ï¥Î
|
|
|
2017/7/28 ¤U¤È 10:27:40
>§Ú must ªº·N«ä¬On³Ì²×Ãþ§O¶·¹ê§@©Î§ï¼g¥Îªº¡A¤£¶·³o»ò°µªº·íµM´N¤£À³¸Ó¨Ï¥Î
§A©w¤¶±ªº·N«ä¬OÅý¤¶±«È¤áºÝªºÅÞ¿è¥i¥H³Q«¥Î ¦ý¬O¤í¯Ê¬Y¨Ç¥\¯à¡A¦Ó =0 ¬O½T«O¦³¨º¨Ç¥\¯à¦s¦b ¦Ó¨Ï¥Î¨º¬qÅ޿誺¤H¡An«ç»ò¹ê§@¬OµLªk³Q¬ù§ôªº ¦pªG¥L¦³¥²nÄ~¼h¨ì²Ä¤G¼h¡Aªí¥Ü¥Ln«¥Î²Ä¤@¼hªº¤º®e ¦pªG§A¥[¤F must ¦Ó¥LnÄ~©Ó²Ä¤G¼h¡A´Nn©I¥s¤@¦¸ super µM«á¤°»ò³£¤£§@¡A³o¬O¦h¦¹¤@Á| °ÝÃD¦b©ó§AµLªk¬ù§ô¥L«ç»ò¹ê§@¡A§A¥u¬On¤@Ó¥\¯à¦Ó¤w¡A¥LÁÙ¬O¥i¥H¥Î¦UºØ¤èªk¸õ¹L must ¥L¯uªº¤@©wn«§@¡A¬°¤°»ò¤£¦¨¬°²Ä¤GÓ child ´N¦n¡A«Dn¦¨¬° grandson ?
A() ®Ú¾Ú Prototype ¼g½X¡AB ´£¨Ñ Prototype ¥\¯à¡AC Ä~©Ó Prototype ªº«Ä¤l B A() «¥Î B/C ªºµ{¦¡½X¡AC «¥Î B ªºµ{¦¡½X¡A©I¥s A() ªº«È¤á«¥Î¥¦ªºÅÞ¿è´N¬Oª«¥ó¾É¦V´£¨Ñªº¼g½X¤è¦¡
|
|
|
2017/7/29 ¤W¤È 02:53:32
>>°²¦p Animal Ä~©Ó¤F Prototype ¦Ó¥B¹ê§@¤F Clone() >>¨º Tiger Ä~©Ó¤F Animal «á, ¨ä¹ê´N¥u»Ýn°w¹ï»P Animal ¤£¦Pªº¦a¤è¥h§ï¼g, Ä~©Óªº·N¸q¤£´N¬O§Æ±æ code ¥i¥H leverage ¤÷Ãþ§O ? > >©Ò¥H¤£·|¦³½Ä¬ð°Ú¡AY¦hÓ must µ{¦¡¤£´N·|§ó°·§§
½Ä¬ðªºÂI¦b§A§Y¨Ï¦³ must, ¦Ó Tiger implement Clone() ¦ýª½±µ©I¥s¤÷Ãþ§Oªº Clone() ¤°»ò¨Æ¤]¨S°µ ©Ò¥H must ¬O¦b must ¤°»ò¨Æ±¡ ? Clone() ¨CÓ¤lÃþ§O³£¦³«¼g, µ²ªG¥\¯à¥þ³¡¬Û¦P (³£©I¥s¤÷Ãþ§O)
>>must ¥i¯à¸òÄ~©Óªº·§©À¦³ÂI½Ä¬ð§a ? > >¬Ý¤£¥X¦³¤°»ò½Ä¬ð Ä~©Ó´N¬O§Æ±æµ{¦¡¥i¥H«½Æ§Q¥Î µ²ªG¤÷Ãþ§O©w¸q must, µ²ªG¤lÃþ§O¹³¤W±ªº¤è¦¡¦P¼Ëªºµ{¦¡¤@ª½¦b«½Æ¼g >§Y¨Ï¨S¦³ must¡A¤]¦³§A¤@¼Ëªº°ÝÃD¡A³o¬Oµ{¦¡ûªº°ÝÃD§a > >>©Ò¥HÀ³¸Ó°Ý»¡, ·Q±j¢¤lÃþ§O¹ê§@¥Xþ¨Ç¤£¦P³B ? > >¦]¬°¦³¥²n¡An½T©w¬YÓµêÀÀ¨ç¼Æ¤@©w·|³Q³Ì²×Ãþ§O¹ê§@ªº¶·n¡Aµ{¦¡ûn«ç»ò°µµLªk±±¨î¡A¤£¯à°µ¬°¤Ï¹ïªº²z¥Ñ
¥²n¦bþ ? ¤lÃþ§O®]Ãþ§O Clone() ¥þ³¡³£¼gªº¤@¼Ë => code ¼g¤F¤@°ï, ¥\¯à§¹¥þ¬Û¦P ©Ò¥H§AÁÙ¬O¨S¦^µª«ÂI, §A·Q±j¢¤lÃþ§O ¹ê§@þ¨Ç¤£¦P³B
¥t¥~¥H¶i¤Æ½×ªºÆ[ÂI¨Ó¬Ý, ì©l¤Hı±o®³¼Ðºj¥´Ây«Ü«n, ±j¢¤l/®]Ãþ§O¨CÓ³£n·|®³¼Ðºj¥´Ây.. ºt¤Æ¨ì²{¦b, ®³¼Ðºj¥´Ây«n¶Ü ? ©Ò¥Hn¥H²{¦bªº«n©Ê¥h¹w´ú¥¼¨Óªº«n©Ê, ¬O§_¯uªº¬O must ?
|
|
|
2017/7/29 ¤W¤È 07:46:33
> ½Ä¬ðªºÂI¦b§A§Y¨Ï¦³ must, ¦Ó Tiger implement Clone() ¦ýª½±µ©I¥s¤÷Ãþ§Oªº Clone() ¤°»ò¨Æ¤]¨S°µ > ©Ò¥H must ¬O¦b must ¤°»ò¨Æ±¡ ? Clone() ¨CÓ¤lÃþ§O³£¦³«¼g, µ²ªG¥\¯à¥þ³¡¬Û¦P (³£©I¥s¤÷Ãþ§O)
´Nºâ¨S¦³ must¡A¨CÓ¹ê§@Ãþ§OÁÙ¬O±o¹ê§@ Clone()¡Amust ¥u¬O½Ð½s;¹À°¦£Àˬd¹ê§@Ãþ§O¬O¤£¬O¦³¹ê§@ Clone() ¦Ó¤w¡A§A¥h©I¥s¤÷Ãþ§O°µ¤°»ò¡AClone() ´N¬On§ï¼g¤÷Ãþ§Oªº Clone()¡A©È¤lÃþ¨S¥h§ï¼g§Ú¤~´£¥X must¡A§AÁÙ¥h©I¥s¤÷Ãþ¡A³o©M¤lÃþ¨S¹ê§@ Clone() ¦³¤°»ò¨â¼Ë¡C
> Ä~©Ó´N¬O§Æ±æµ{¦¡¥i¥H«½Æ§Q¥Î > µ²ªG¤÷Ãþ§O©w¸q must, µ²ªG¤lÃþ§O¹³¤W±ªº¤è¦¡¦P¼Ëªºµ{¦¡¤@ª½¦b«½Æ¼g
½Ö³W©w¤lÃþ¤@©wn¥h©I¥s¤÷Ãþ¤~¥sÄ~©Ó > > ¥²n¦bþ ? ¤lÃþ§O®]Ãþ§O Clone() ¥þ³¡³£¼gªº¤@¼Ë => code ¼g¤F¤@°ï, ¥\¯à§¹¥þ¬Û¦P > ©Ò¥H§AÁÙ¬O¨S¦^µª«ÂI, §A·Q±j¢¤lÃþ§O ¹ê§@þ¨Ç¤£¦P³B
§A¾K¤F¶Ü
> ¥t¥~¥H¶i¤Æ½×ªºÆ[ÂI¨Ó¬Ý, ì©l¤Hı±o®³¼Ðºj¥´Ây«Ü«n, ±j¢¤l/®]Ãþ§O¨CÓ³£n·|®³¼Ðºj¥´Ây.. > ºt¤Æ¨ì²{¦b, ®³¼Ðºj¥´Ây«n¶Ü ? > ©Ò¥Hn¥H²{¦bªº«n©Ê¥h¹w´ú¥¼¨Óªº«n©Ê, ¬O§_¯uªº¬O must ?
³o¤£´N¬ðÅã¤F must ªº¥²n©Ê¡A¦pªG¤£¥h§ï¼g¡A¥Ã»·³£®³¼Ðºj¥´Ây
|
|
|
2017/7/29 ¤W¤È 08:45:06
>> ½Ä¬ðªºÂI¦b§A§Y¨Ï¦³ must, ¦Ó Tiger implement Clone() ¦ýª½±µ©I¥s¤÷Ãþ§Oªº Clone() ¤°»ò¨Æ¤]¨S°µ >> ©Ò¥H must ¬O¦b must ¤°»ò¨Æ±¡ ? Clone() ¨CÓ¤lÃþ§O³£¦³«¼g, µ²ªG¥\¯à¥þ³¡¬Û¦P (³£©I¥s¤÷Ãþ§O) > >´Nºâ¨S¦³ must¡A¨CÓ¹ê§@Ãþ§OÁÙ¬O±o¹ê§@ Clone()¡Amust ¥u¬O½Ð½s;¹À°¦£Àˬd¹ê§@Ãþ§O¬O¤£¬O¦³¹ê§@ Clone() ¦Ó¤w¡A§A¥h©I¥s¤÷Ãþ§O°µ¤°»ò¡AClone() ´N¬On§ï¼g¤÷Ãþ§Oªº Clone()¡A©È¤lÃþ¨S¥h§ï¼g§Ú¤~´£¥X must¡A§AÁÙ¥h©I¥s¤÷Ãþ¡A³o©M¤lÃþ¨S¹ê§@ Clone() ¦³¤°»ò¨â¼Ë¡C > >> Ä~©Ó´N¬O§Æ±æµ{¦¡¥i¥H«½Æ§Q¥Î >> µ²ªG¤÷Ãþ§O©w¸q must, µ²ªG¤lÃþ§O¹³¤W±ªº¤è¦¡¦P¼Ëªºµ{¦¡¤@ª½¦b«½Æ¼g > >½Ö³W©w¤lÃþ¤@©wn¥h©I¥s¤÷Ãþ¤~¥sÄ~©Ó §Ú¨S³o»ò»¡§a ? §A¦³¬ÝÀ´ !??
> >> >> ¥²n¦bþ ? ¤lÃþ§O®]Ãþ§O Clone() ¥þ³¡³£¼gªº¤@¼Ë => code ¼g¤F¤@°ï, ¥\¯à§¹¥þ¬Û¦P >> ©Ò¥H§AÁÙ¬O¨S¦^µª«ÂI, §A·Q±j¢¤lÃþ§O ¹ê§@þ¨Ç¤£¦P³B > >§A¾K¤F¶Ü ¬O§A§a !?
> >> ¥t¥~¥H¶i¤Æ½×ªºÆ[ÂI¨Ó¬Ý, ì©l¤Hı±o®³¼Ðºj¥´Ây«Ü«n, ±j¢¤l/®]Ãþ§O¨CÓ³£n·|®³¼Ðºj¥´Ây.. >> ºt¤Æ¨ì²{¦b, ®³¼Ðºj¥´Ây«n¶Ü ? >> ©Ò¥Hn¥H²{¦bªº«n©Ê¥h¹w´ú¥¼¨Óªº«n©Ê, ¬O§_¯uªº¬O must ? > >³o¤£´N¬ðÅã¤F must ªº¥²n©Ê¡A¦pªG¤£¥h§ï¼g¡A¥Ã»·³£®³¼Ðºj¥´Ây ¤´¬Ý¤£¥X¨Ï¥Î must ¨ä¥²n©Ê °²¦p¤@ÓÃþ§OÄ~©Ó¨ì¤F 100 ©Î¬O 1000 Ó must, ¨º¨ºÓÄ~©ÓªºÃþ§O¤£´N 100 Ó must ³£n·dÀ´ function ¨ì©³¦b°µ¤°»ò ?
> µ{¦¡ûn«ç»ò°µµLªk±±¨î¡A¤£¯à°µ¬°¤Ï¹ïªº²z¥Ñ
¬JµMµLªk±±¨îµ{¦¡ûn«ç»ò°µ, ªí¥Ü§A¥un¨D 1. ¥¦n¦³ 2.¥¦¤@©wn³Q§ï¼g 1 => ¥i¥H¥Î virtual + Ä~©Ó 2 => ¦p«e©Òz, Ä~©Ó¤@°ï must ¥H«á, ÁÙnªá®É¶¡¥h½Æ»s¶K¤W¤@°ï«½Æªº code (¥i¯à³s§ï³£¨S§ï), ¯uªº¹ï coding ¦³¤ñ¸û®e©ö ?
|
|
|
2017/7/29 ¤W¤È 08:55:50
>> ¥t¥~¥H¶i¤Æ½×ªºÆ[ÂI¨Ó¬Ý, ì©l¤Hı±o®³¼Ðºj¥´Ây«Ü«n, ±j¢¤l/®]Ãþ§O¨CÓ³£n·|®³¼Ðºj¥´Ây.. >> ºt¤Æ¨ì²{¦b, ®³¼Ðºj¥´Ây«n¶Ü ? >> ©Ò¥Hn¥H²{¦bªº«n©Ê¥h¹w´ú¥¼¨Óªº«n©Ê, ¬O§_¯uªº¬O must ? > >³o¤£´N¬ðÅã¤F must ªº¥²n©Ê¡A¦pªG¤£¥h§ï¼g¡A¥Ã»·³£®³¼Ðºj¥´Ây
no,
¨Ï¥Î must ªº±¡ªp : °²¦p root class «Å§i¤F ®³¼Ðºj¥´Ây(), ¨ì¤F²Ä 10 ¥Nµo²{¤£¾A¥Î§ï¼g, ¦ý²Ä 11, 12,... ¨ì 100 ¨C¤@¥N³£ÁÙn§â ®³¼Ðºj¥´Ây() ®³¥X¨Ó¼g¤@¤Uªº·N¸q¦bþ ? (®³¨Ó«ô¤@¤U ?)
¨Ï¥Î virtual ªº±¡ªp : °²¦p root class «Å§i¤F ®³¼Ðºj¥´Ây(), ²Ä 10 ¥N¨Ï¥Îµo²{¤w¸g¤£««á§ï¼g, ²Ä 11, 12 ¨ì 100 ³£¥i¥H¤£¥Î¥hºÞ ®³¼Ðºj¥´Ây(), ¥un±Mª`·s¥\¯àªº³¡¤À
|
|
|
2017/7/29 ¤W¤È 10:16:32
§Ú»¡ªº must ¬O¬°¤F¥²¶·n¹ê§@¡B§ï¼gªºµêÀÀ¨ç¼Æ¦Ó¥[ªº¡A¹ï©ó¤£¶·¤@©wn¹ê§@¡B§ï¼gªºµêÀÀ¨ç¼Æµwn¥[¤W must ¤~»¡¤£n¹ê§@¡A³o¬Oµ{¦¡ûªº¿ù¡A¤£n¥h©Ç must
|
|
|
2017/7/29 ¤U¤È 03:16:50
C++ ¦b¨î©w³\¦h¯S©Ê®Éªººn¦Ò¼{«ÂI¨Ã¤£¬On¸T¤îµ{¦¡®v·h¥ÛÀY¯{¦Û¤vªº¸}¡A³o¦n¹³¬O¬Y©eû»¡¹Lªº¸Ü¡C ©Ò¥H¦b¨î©w¼Ð·Çªº®ÉÔ¡A·í§_¨Çp¹º¤¤ªº¯S©Ê¥i¥Hµ¹¨Ï¥ÎªÌ±a¨Ó¦h¤è«K¡B©Î§ó¦h²Õ¦X¼u©Ê¡A¦ý«o¤]¦³¯à¤O¦b¤£·íªº¨Ï¥Î¤§¤U³y¦¨¦M®`®É¡A³q±`«áªÌ¼vÅT·|³Q©¿²¤¡C ©Ò¥H C++ ©ÎªÌ¬O C ¥»¨´Nn¨D°ª¯À½èªºµ{¦¡³]p¤Hû¡A³o¬O»y¨¥õ¾Ç¥»¨ªº¨ì¿ý¨ú±Ë°ÝÃD¡F¥t¤@Ó·¥ºÝªº³¡¥÷¥i¥H°Ñ¦Ò Java ©Î¨ä¥Lªñ¥Nªº°ª¶¥»y¨¥¡C ÁöµM¦UºØ»y¨¥ªº³]p®v±Ú¸s¸Ì³£·|¦³¨Ç®`¸s¤§°¨¡A¦ý§C¯À½è³]p®v¦b¥H C++ ¼g¦¨ªº±M®×¸Ì³y¦¨ªº¯}Ãa¤j·§¬O©Ò¦³¨ä¥Lµ{¦¡»y¨¥©ÒµLªk¤ñ¸ûªº¡I
¤W±»¡³o»ò¦h¡A´N¬Onªí¹F¤@ÂI¡GC++ ³q±`¨S¦³¯à¤Oªý¤î¨Ï¥ÎªÌ°µÄø¨Æ¡AÁöµMµ{¦¡®w³]pªÌ³q±`·Q¾¨¶qÁ×§K¨Ï¥ÎªÌ°µÄø¨Æ¡C
»yªk¤W¡A¥u¦³¯Âµê¨ç¦¡n¨D¤l¥N¥²¶·n¹ï¨ä¶i¦æ¹ê°µ¡A¦Ü©óþ¤@¥N¤~°µ¡A¥¦´N¤£ºÞ¤F¡A¤Ï¥¿¨Ï¥Î«e¦³°µ¥X¨Ó´N¦n¡I «á¨Ó¥[¤Jªº override ©M final ÃöÁä¦r¡A¤]ˤ£¬On¸T¤î¨Ï¥ÎªÌ°µÄø¨Æ¡A¥Dnªº¥ØªºÀ³¸Ó¬OnÁ×§K¦]¬°¥´¿ù¦r¡A©Îª©¥»§ó·sªº½t¬G©Ò³y¦¨ªº¿ù»~¡I
¬°¤°»ò¨S¦³´£¨Ñ must ÃöÁä¦r¡A§Ú·Qì¦]¦b«e±ªº°Q½×¤¤«Ü©úÅã¤F¡C must ÁY¤F¨Ï¥ÎªÌªº³]p¼u©Ê¡A¤]¨S¦³©úÅã±a¨Ó³]p¤Wªº¤°»ò¤è«K©Ê¡C ·íµM¡A§Ú¤£´±ªÖ©w¡A¤]³\¥H«áªº C++ ·|¤£·|¥[¤J³oÓªF¦è¡I²¦³º§Ú¤£¬O¤°»ò¤j¯«¡A«ç»ò¯à¯u¥¿²z¸Ñ¤j¯«Ìªº·Qªk¡H
¥¼¨Ó¥ý¤£»¡¡A¥H²{ª¬¦Ó¨¥¡A´N¥Î¼Ó¥DÃDªº Clone ¨ç¦¡°Q½×¡G ¨ä¹ê C++ ¦b³o¤è±¤]¦³¼Ó¥DÃD¨ìªºª«¥ó½Æ»s¦æ¬°¦b¹ê°µ¤W®e©ö³Q©¿²¤ªº¯Ê³´¡A¦Ó¥B¦ü¥G¨Ã¨S¦³±q»yªk¤W°µ¥X¤°»ò¨î±¹¬I¡C ¤ñ¦p»¡ T::T(const T&) ©M T& operator=(const T&) ³o¨âӨ禡¡A§Ú·Qµy·L¤F¸Ñ C++ ªº¤H´Nª¾¹D§Ún»¡¤°»ò¡A´N¤£¦h¸ÑÄÀ¡C ´£³o¨âӨ禡¬O¦]¬°¥LÌ©M Clone ¨ç¦¡¦³¬Û¦ü¯S©Ê¡B¹ê°µ¤W³£¥i¯à³Q©¿²¤¡B¥B³£¥¼¦³¤°»òì¥Íªº¨î©Î´£¿ô±¹¬I¡C
|
|
|
2017/7/29 ¤U¤È 06:53:18
class Prototype { public: Prototype() {} virtual ~Prototype() {}
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() = 0; };
class A:public Prototype { public: A() {} virtual ~A() {}
virtual Prototype *Clone() { return new A; } };
class B:public A { public: B() {} virtual ~B () {} };
class B2 :public A { public: B2() {} virtual ~B2() {}
virtual Prototype *Clone() { return new A; // Äø¨Æ } };
int main() { Prototype *B_Obj = new B; Prototype *B2_Obj = new B2;
Prototype *B_ObjErr = B_Obj->Clone(); Prototype *B2_ObjErr = B2_Obj->Clone(); return 0; }
¥H¤W¦b¨S¦³ must ·|¥X²{ªº°ÝÃD¡AY¦³ must «h¥iÁ×§K class B ªº±¡ªpµo¥Í¡A¦Ü©ó class B2 ¤£ºÞ¦³¨S¦³ must ¤@¼Ë³£·|µo¥Í¡A³oÃö must ¤°»ò¨Æ
|
|
|
2017/7/29 ¤U¤È 06:59:46
³oÓ¨Ò¤l¥¿¦n¥Ü½d must ¤£¯à¸Ñ¨M°ÝÃD¡A¦Ó B À³¸ÓÄ~©Ó Prototype ¦Ó¤£¬O A
B2 ¥i¥H¥Î co-variant return type ¤£¹L°ÝÃD¤£¦b³o¡A°ÝÃD¦b©ó¼gªº¤Hnª¾¹D
|
|
|
2017/7/29 ¤U¤È 07:10:12
>¤ñ¦p»¡ T::T(const T&) ©M T& operator=(const T&) ³o¨âӨ禡¡A§Ú·Qµy·L¤F¸Ñ C++ ªº¤H´Nª¾¹D§Ún»¡¤°»ò¡A´N¤£¦h¸ÑÄÀ¡C >´£³o¨âӨ禡¬O¦]¬°¥LÌ©M Clone ¨ç¦¡¦³¬Û¦ü¯S©Ê¡B¹ê°µ¤W³£¥i¯à³Q©¿²¤¡B¥B³£¥¼¦³¤°»òì¥Íªº¨î©Î´£¿ô±¹¬I¡C
T::T(const T&) ©M T& operator=(const T&) ¥u¬O¬Y¤@¼h±(¥]¬A¤÷Ãþ¥H¤W)¸ê®Æªº½Æ»s¡Aclone() ¬Oª«¥óªº§¹¥þ½Æ»s
|
|
|
2017/7/29 ¤U¤È 07:15:29
>³oÓ¨Ò¤l¥¿¦n¥Ü½d must ¤£¯à¸Ñ¨M°ÝÃD¡A¦Ó B À³¸ÓÄ~©Ó Prototype ¦Ó¤£¬O A
§A¨S¦³·d²M·¡¦b°Q½×¤°»ò¡A´N¬O¦b°Q½× B Ä~©Ó¦Û A
>B2 ¥i¥H¥Î co-variant return type ¤£¹L°ÝÃD¤£¦b³o¡A°ÝÃD¦b©ó¼gªº¤Hnª¾¹D
©Ò¥HÃö must ¤°»ò¨Æ
|
|
|
2017/7/29 ¤U¤È 07:25:28
§A¦Û¤v·Q·Q¬Ý Prototype ªº¥Øªº§a ¥Lnªº¬O¤@Ó Prototype *¶Ç¦^È¡A¦Ó¤£¬O¥h¨î§O¤H¶Ç¦^¤°»ò¡A¤Î¦p¦ó¹ê§@ ¨Æ¹ê¤W must ¤]¹F¤£¨ì³oºØn¨D¡AB2 ªº¨Ò¤l¥¿¦n»¡©ú¦pªG¦³ must ªº¸Ü¥LÁÙ¬O¥i¥H¼g¿ù ³oÓ¨Ò¤l¥Ü½dªº¬O¿ù»~¨Ï¥ÎÄ~©Ó¡A¨Æ¹ê¤W B ¸ò B2 ³£À³¸ÓÄ~©Ó Prototype ¦Ó¤£¬O A
|
|
|
2017/7/29 ¤U¤È 07:36:27
>§A¦Û¤v·Q·Q¬Ý Prototype ªº¥Øªº§a >¥Lnªº¬O¤@Ó Prototype *¶Ç¦^È¡A¦Ó¤£¬O¥h¨î§O¤H¶Ç¦^¤°»ò¡A¤Î¦p¦ó¹ê§@ >¨Æ¹ê¤W must ¤]¹F¤£¨ì³oºØn¨D¡AB2 ªº¨Ò¤l¥¿¦n»¡©ú¦pªG¦³ must ªº¸Ü¥LÁÙ¬O¥i¥H¼g¿ù >³oÓ¨Ò¤l¥Ü½dªº¬O¿ù»~¨Ï¥ÎÄ~©Ó¡A¨Æ¹ê¤W B ¸ò B2 ³£À³¸ÓÄ~©Ó Prototype ¦Ó¤£¬O A
§A³Q ¤¶±-¹ê§@ ªº·Qªk¸j¦º¤F¡A¤£¬O¦b°Q½×³oÓ¡A¦Ó¬O¦b°Q½×¥Íª«¤ÀÃþ¡B¸ê®Æ®w...µ¥µ¥ªºÄ~©Ó°ÝÃD
|
|
|
2017/7/29 ¤U¤È 08:26:06
>§A³Q ¤¶±-¹ê§@ ªº·Qªk¸j¦º¤F¡A¤£¬O¦b°Q½×³oÓ¡A¦Ó¬O¦b°Q½×¥Íª«¤ÀÃþ¡B¸ê®Æ®w...µ¥µ¥ªºÄ~©Ó°ÝÃD >
§Anªº¥Øªº¡AµL«D´N¬O©È¨Ï¥ÎªÌ§Ñ°O¹ê§@¡A¦Óªu¥Î¤F¤÷Ãþ§Oªº¹ê§@¡C ¦³¤F must ¥i¥H°_¤@Ó´£¿ôªº§@¥Î¡A¦Ü¤Ö¥i¥H¨ÓÀ˵ø¤@¤U§ï¼g¨ç¼Æ¡C ¥u¬O must µLªk½T«O¹ê§@ªÌ¥¿½T¹ê§@¡A¤£¹L§Ú«á¨Ó·Q·Q =0 ¤]¬O¤@¼Ë §Ú¬Oı±o¦³ must ¤]¥i¥H¡A¦Ü¤Ö¦³´£¿ô§@¥Î¡A¥H Clone ¨Ó»¡º¡¦³¥Îªº ¨ä¥L³õ¦X¥i¯à¥Î³B¤£¤j´N¬O¤F¡C
·d¤£¦n¨ä¥L»y¨¥¥i¥H¥Î¨ä¥L¤è¦¡¹F¦¨¡A³o¼Ë´N¤£¥Î¦h¤@Ó»y¨¥ÃöÁä¦r
|
|
|
2017/7/29 ¤U¤È 10:26:03
>int main() >{ > Prototype *B_Obj = new B; > Prototype *B2_Obj = new B2; > > Prototype *B_ObjErr = B_Obj->Clone(); > Prototype *B2_ObjErr = B2_Obj->Clone(); > > return 0; >} > >¥H¤W¦b¨S¦³ must ·|¥X²{ªº°ÝÃD¡AY¦³ must «h¥iÁ×§K class B ªº±¡ªpµo¥Í¡A¦Ü©ó class B2 ¤£ºÞ¦³¨S¦³ must ¤@¼Ë³£·|µo¥Í¡A³oÃö must ¤°»ò¨Æ
¨ä¹ê³oÓ°ÝÃDªº®Ú¥»ì¦]¬O¦]¬° new «á±¥u¯à±µ class name ªºÃö«Y, ©Ò¥H§A¤~·Q¥Î must n¨D¤lÃþ§O¤@©wn¼gÄÝ©ó¦Û¤vªº new ©Ò¥H°²¦p¯à¨Ï¥Î¦r¦ê¨Ó new object, ¤]¤£»Ýn¦³ must ¤F, ¬O§a ?
³oÃþªº°ÝÃD¦³«Ü¦h implement, §ä c++ object factory ´N¥i¥H§ä¨ì«Ü¦h https://www.codeproject.com/Articles/567242/AplusC-b-bplusObjectplusFactory https://stackoverflow.com/questions/4357500/c-abstract-factory-using-templates
¥Ø«e¬Ý¨ìªº³£»Ýn¤â°Êµù¥U (©I¥s macro )
¦³¨Ç»y¨¥ª½±µ¨Ï¥Î¦r¦ê´N¥i¥H new object ¤F
|
|
|
2017/8/1 ¤U¤È 08:02:15
>§Ú¬Oı±o¦³ must ¤]¥i¥H¡A¦Ü¤Ö¦³´£¿ô§@¥Î¡A¥H Clone ¨Ó»¡º¡¦³¥Îªº >¨ä¥L³õ¦X¥i¯à¥Î³B¤£¤j´N¬O¤F¡C
¥H¤W±§Ú¶Kªº¨Ò¤l¨Ó»¡¡APrototype ¥u¬O¤@Óª«¥óªº¥Nªí¡A¤£¯à°µ¤°»ò ¨Æ¡A¶·n°t¦X³X°ÝªÌ¼Ò¦¡(Visitor ½Ð¤Wºô¬d¬Ý)¨Ó¥Î¡A©Ò¥H Prototype ×§ï¥H¤U
class Prototype { public: Prototype() {} virtual ~Prototype() {}
// ¤]¶·n¨C¼h¹ê§@Ãþ§O¹ê§@ void Accept(Visitor *v) = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() = 0; };
¨ºÓ Accept() ¤]¶·n must ªº¤ä´©
ÁÙ¦³¶}ÀY´£¨ìªº¥ÃºüÀx¦s¡A¸ê®Æ¬O«Ê¸Ëªº¡A¥u¦³Ãþ§O¦Û¤v¤~¯à¦s ¨ú¡A¨C¼hÃþ§Oªº³£±o¹ê§@¤@ÓµêÀÀ¨ç¼Æ¡A³oÓ¤]¶·n must ªº¤ä´©
|
|
|
2017/8/1 ¤U¤È 08:05:25
>©Ò¥H°²¦p¯à¨Ï¥Î¦r¦ê¨Ó new object, ¤]¤£»Ýn¦³ must ¤F, ¬O§a ?
¬O¥H¤U³o¼Ë¶Ü¡AÁÙ¤£¬O¤@¼Ë
class Prototype { public: Prototype() {} virtual ~Prototype() {}
// ¤]¶·n¨C¼h¹ê§@Ãþ§O¹ê§@ std::string GetName() = 0;
};
|
|
|
2017/8/1 ¤U¤È 08:51:08
>¥H¤W±§Ú¶Kªº¨Ò¤l¨Ó»¡¡APrototype ¥u¬O¤@Óª«¥óªº¥Nªí¡A¤£¯à°µ¤°»ò >¨Æ¡A¶·n°t¦X³X°ÝªÌ¼Ò¦¡(Visitor ½Ð¤Wºô¬d¬Ý)¨Ó¥Î¡A©Ò¥H Prototype >×§ï¥H¤U > >class Prototype >{ >public: > Prototype() {} > virtual ~Prototype() {} > > // ¤]¶·n¨C¼h¹ê§@Ãþ§O¹ê§@ > void Accept(Visitor *v) = 0; > > // ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó > virtual Prototype *Clone() = 0; >}; > >¨ºÓ Accept() ¤]¶·n must ªº¤ä´© > >ÁÙ¦³¶}ÀY´£¨ìªº¥ÃºüÀx¦s¡A¸ê®Æ¬O«Ê¸Ëªº¡A¥u¦³Ãþ§O¦Û¤v¤~¯à¦s >¨ú¡A¨C¼hÃþ§Oªº³£±o¹ê§@¤@ÓµêÀÀ¨ç¼Æ¡A³oÓ¤]¶·n must ªº¤ä´© >
Visitor Pattern: https://en.wikipedia.org/wiki/Visitor_pattern
·s¼W visitor ¨Ó´À element °ÊºA·s¼W¨ç¼Æ ¦ý¬O¹ï©ó accept() ªº¹ê§@¨Ó»¡¬O©T©wªº¡A¬O ±Ä¥Î double-dispatch §âª«¥ó«¬ºA¸ÑªR¥X¨Ó Åý visitor¥i¥H¹ê²{·sªººtºâªk
¦p¦¹¬Ý¨Ó¡A¬O§_¯uªº¨º»ò»Ýn must ©O¡H §Y¨ÏÄ~©Ó¨ì²Ä¤G¼h¡A¥¦¤@¼Ë¥un visitor.accept(this) ¤£¹L¤£ºÞ«ç»ò»¡ must ÁÙ¬O¥i¥H°_¨ì¤@Ó´£¿ôªº§@¥Î Åý¹ê§@ªÌ¦h¬Ý¤@²´
§Ú·|ı±o Clone «Ü¦³¥Î¡A¬O¦]¬°§Y¨Ï¥¦¤£·s¼W¸ê®Æ §A·|Ä~©Ó¤]¤@©w·|§ï¼g¨ç¼Æ¤º®e¡A¦pªG new ¿ùª«¥ó §Y¨Ï data ¤£·|¦³¿ù¡A¹w´Áªº behavior ¤]¨«¼Ë¤F¡A ©Ò¥H¤£¯à²£¥Í¿ù»~¡A¤~¦P·N¹ï Prototype º¡¦³¥Îªº
|
|
|
2017/8/1 ¤U¤È 09:22:07
>§Y¨ÏÄ~©Ó¨ì²Ä¤G¼h¡A¥¦¤@¼Ë¥un visitor.accept(this)
§A¥²¶·n°²³]¨C¤@¼hÃþ§Oªº this ³£¤£¤@¼Ë¡A©Ò¥H¨C¤@¼h³£»Ýn¹ê§@
|
|
|
2017/8/1 ¤U¤È 09:54:41
>§A¥²¶·n°²³]¨C¤@¼hÃþ§Oªº this ³£¤£¤@¼Ë¡A©Ò¥H¨C¤@¼h³£»Ýn¹ê§@
¨C¤@¼h¬O¤£¤@¼Ë§r¡A¦ý¬O Visitor.visit(this) ¤§«á´N·|¸ÑªR¥X¨Ó¤F
Visitor n¹ê§@¦UºØªº visit(XxxPrototype) ³o¼Ë¤~¯àÂX¥Rºtºâªk¡A¤@Ó Visitor ¹ïÀ³¤@Óºtºâªk
¨C¤@¼h³£n¹ê§@ visitor.visit(this)
¦pªG must ªº¸Ü¡A§Y¨Ï¹ê§@¤º®e¤@¼Ë¡AÁÙ±o super.accept(visitor) ¤@¤U¡A³o¬O¦h¾lªº
·íµM¡A¦pªG¦³ composite Prototype ªº¸Ü¡A¥¦ªº accept ªÖ©w¤£¤@¼Ë¡A¹³ wiki ¤¤Á|¨Òªº
¦³ must ªº¸Ü¥i¥H´£¿ô¤@¤U¥¦¡An§â¥¦¼g¹ï¡A¦ý§Úı±o composite element ¥i¯àª½±µÄ~©Ó element ¤ñ¸ûª½±µ¤@ÂI
|
|
|
2017/8/1 ¤U¤È 11:17:24
> >>©Ò¥H°²¦p¯à¨Ï¥Î¦r¦ê¨Ó new object, ¤]¤£»Ýn¦³ must ¤F, ¬O§a ? > >¬O¥H¤U³o¼Ë¶Ü¡AÁÙ¤£¬O¤@¼Ë > >class Prototype >{ >public: > Prototype() {} > virtual ~Prototype() {} > > // ¤]¶·n¨C¼h¹ê§@Ãþ§O¹ê§@ > std::string GetName() = 0; > >};
§Ú»¡ªº¬O¹³³o¼Ë¤lªº : obj = new("Prototype"); C++ ¨S¦³ª½±µ support, ¤£¹L¦³¥]¸Ë¹Lªº
// ConsoleApplication1.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include <map>
class Base { public: virtual ~Base() {}
virtual bool Get() = 0; };
class DerivedA : public Base { public: bool Get() { return true; } };
class DerivedB : public Base { public: bool Get() { return false; } };
template <class T> class Creator { public: virtual ~Creator(){} virtual T* Create() = 0; };
template <class DerivedType, class BaseType> class DerivedCreator : public Creator<BaseType> { public: BaseType* Create() { return new DerivedType; } };
template <class T, class Key> class Factory { public: void Register(Key Id, Creator<T>* Fn) { FunctionMap[Id] = Fn; }
T* Create(Key Id) { return functionMap[Id]->Create(); }
~Factory() { std::map<Key, Creator<T>*>::iterator i = functionMap.begin(); while (i != functionMap.end()) { delete (*i).second; ++i; } } private: std::map<Key, Creator<T>*> functionMap; };
int _tmain(int argc, _TCHAR* argv[]) { //Register Factory<Base, char*> temp; temp.Register("DA", (Creator<Base>*)new DerivedCreator<DerivedA,Base>); temp.Register("DB", (Creator<Base>*)new DerivedCreator<DerivedB,Base>);
//Pointer to base interface Base* pBase = 0;
//Create and call pBase = temp.Create("DA"); printf("DerivedA %u\n", pBase->Get()); delete pBase;
//Create and call pBase = temp.Create("DB"); printf("DerivedB %u\n", pBase->Get()); delete pBase;
return 0; }
|
|
|
2017/8/2 ¤W¤È 11:47:03
>¦pªG must ªº¸Ü¡A§Y¨Ï¹ê§@¤º®e¤@¼Ë¡AÁÙ±o super.accept(visitor) ¤@¤U¡A³o¬O¦h¾lªº
¤£²M·¡§A³o¥yªº·N«ä¡A§Úª½±µ¼g¥X¨Ò¤l¦n¤F
#include <iostream>
using namespace std;
class A; class B; class B2; class C;
class Visitor { public: Visitor(){} ~Visitor(){}
void Visit(A *a) { cout << "this is A" << endl; }
void Visit(B *b) { cout << "this is B" << endl; }
void Visit(B2 *b2) { cout << "this is B2" << endl; }
};
class Prototype { public: Prototype() {} virtual ~Prototype() {}
// ¤]¶·n¨C¼h¹ê§@Ãþ§O¹ê§@ virtual void Accept(Visitor *v) = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() = 0; };
class A :public Prototype { public: A() {} virtual ~A() {}
virtual void Accept(Visitor *v) { v->Visit(this); }
virtual Prototype *Clone() { return new A; } };
class B :public A { public: B() {} virtual ~B() {} };
class B2 :public A { public: B2() {} virtual ~B2() {}
virtual void Accept(Visitor *v) { A::Accept(v); // Äø¨Æ }
virtual Prototype *Clone() { return new A; // Äø¨Æ } };
class C :public A { public: C() {} virtual ~C() {}
virtual void Accept(Visitor *v) { v->Visit(this); }
virtual Prototype *Clone() { return new C; } };
int main() { Visitor v;
Prototype *B_Obj = new B; Prototype *C_Obj = new C;
B_Obj->Accept(&v); // "this is A" C_Obj->Accept(&v); // "this is A"
return 0; }
¦]¨S¦³ must¡A©Ò¥H class B ¨S¦³³Q±j¨î¹ê§@ Accept()
class C ÁöµM¦³¹ê§@ Accept()¡A¦ý class Visitor ¤¤¨S¬° ¥¦·Ç³Æ Visit()
|
|
|
2017/8/2 ¤W¤È 11:53:10
> >§Ú»¡ªº¬O¹³³o¼Ë¤lªº : obj = new('Prototype'); >C++ ¨S¦³ª½±µ support, ¤£¹L¦³¥]¸Ë¹Lªº
§A¼gªºµ{¦¡½X¥u¬O¦b«Øºcª«¥ó¡A©M Clone ¨S¦³¤°»òÃö¦è
¤£¹LY§â Factory ©ñ¤J Base ¤¤¡AClone ®É´N¥Î³o Ó Factory¡A³oˤ]¬O¤@Ó¤èªk
|
|
|
2017/8/2 ¤W¤È 11:55:46
¤£¦n·N«ä¡A³oÃä¬O§Ú¨S·Q²M·¡¡A·d¿ù¤F¡A½T¹ê¤£¯à¥Î¤÷Ãþ§Oªº accept
|
|
|
2017/8/2 ¤U¤È 08:23:56
>>§Ú»¡ªº¬O¹³³o¼Ë¤lªº : obj = new('Prototype'); >>C++ ¨S¦³ª½±µ support, ¤£¹L¦³¥]¸Ë¹Lªº > >§A¼gªºµ{¦¡½X¥u¬O¦b«Øºcª«¥ó¡A©M Clone ¨S¦³¤°»òÃö¦è > >¤£¹LY§â Factory ©ñ¤J Base ¤¤¡AClone ®É´N¥Î³o >Ó Factory¡A³oˤ]¬O¤@Ó¤èªk
§Ú·Q»¡¦³ÂI¥X¨Ó new object ªº¤è¦¡«á, clone ¤]¥i¥H¤p×§ï´N±o¥X¨Ó¤F
#include "stdafx.h" #include <map>
class Base { public: virtual ~Base() {}
virtual bool Get() = 0; virtual Base *Clone() const = 0; };
template <typename Dervied> class Base_CRTP : public Base { public: virtual Base *Clone() const { return new Dervied(static_cast<Dervied const &>(*this)); } };
#define DERIVE_BASE_CRTP(Type) class Type: public Base_CRTP<Type>
//class DerivedA : public Base DERIVE_BASE_CRTP(DerivedA) { public: bool Get() { return true; } };
DERIVE_BASE_CRTP(DerivedB) { public: bool Get() { return false; } };
template <class T> class Creator { public: virtual ~Creator(){} virtual T* Create() = 0; };
template <class DerivedType, class BaseType> class DerivedCreator : public Creator<BaseType> { public: BaseType* Create() { return new DerivedType; } };
template <class T, class Key> class Factory { public: void Register(Key Id, Creator<T>* Fn) { functionMap[Id] = Fn; }
T* Create(Key Id) { return functionMap[Id]->Create(); }
~Factory() { std::map<Key, Creator<T>*>::iterator i = functionMap.begin(); while (i != functionMap.end()) { delete (*i).second; ++i; } } private: std::map<Key, Creator<T>*> functionMap; };
int _tmain(int argc, _TCHAR* argv[]) { //Register Factory<Base, char*> temp; temp.Register("DA", (Creator<Base>*)new DerivedCreator<DerivedA,Base>); temp.Register("DB", (Creator<Base>*)new DerivedCreator<DerivedB,Base>);
//Pointer to base interface Base* pBase = 0; Base* pBase1 = 0; Base* pBase2 = 0;
//Create and call pBase = temp.Create("DA"); printf("DerivedA %u\n", pBase->Get()); pBase1 = pBase->Clone(); delete pBase;
//Create and call pBase = temp.Create("DB"); printf("DerivedB %u\n", pBase->Get()); pBase2 = pBase->Clone(); delete pBase;
printf("Base1 = DerivedA %u\n", pBase1->Get()); printf("Base2 = DerivedB %u\n", pBase2->Get());
return 0; }
|
|
|
2017/8/3 ¤U¤È 12:11:03
·PÁ ccl0504 ªº½d¨Ò¡AÅý§Ú¦³¤FÆF·P¡A¦ý´N¬O¦³¨Ç½ÆÂø¡An¬O¯à¦³ must ªº¤ä´©n²³æ¦h¤F¡A ¥H¤U¬O¦³±j¨î¹ê§@¾÷¨îªº Prototype
#include <iostream> #include <sstream>
using namespace std;
class A; class B; class C; class D;
class Visitor { public: Visitor(){} ~Visitor(){}
void Visit(A *a); void Visit(B *b); void Visit(C *c); void Visit(D *d); };
class Prototype { public: Prototype() {} virtual ~Prototype() {}
// ¥ÃÄòÀx¦s virtual void Save(ostream &save) = 0; virtual void Load(istream &load) = 0;
// ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() = 0; };
// Prototype ©µ¦ùÃþ§OnÄ~©Óªº³Ì¤W¼hÃþ§O class Prototype_ROOT : virtual public Prototype { public: Prototype_ROOT() {} ~Prototype_ROOT() {} };
// ¬°¤F¥i¥H±j¨î¹ê§@¤Î¦h«Ä~©Ó template <typename classification> class Prototype_CRTP : virtual public Prototype { public: Prototype_CRTP(){} ~Prototype_CRTP(){}
// ¥ÃÄòÀx¦s virtual void Save(ostream &save) override = 0; virtual void Load(istream &load) override = 0;
// ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override = 0; };
#define PROTOTYPE_BASE_CRTP(Base) Base,public Prototype_CRTP<Base>
// ³æ¼hÄ~©Ó class A :public PROTOTYPE_BASE_CRTP(Prototype_ROOT) { // ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override { v->Visit(this); }
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override { return new A(*this); }
// ¨°ª int m_Height;
protected: // ¥ÃÄòÀx¦s virtual void Save(ostream &save) override { save << m_Height << ' '; } virtual void Load(istream &load) override { load >> m_Height; }
public: A(int Height) { m_Height = Height; } A(const A &Src) { m_Height = Src.m_Height; } virtual ~A() {}
int GetHeight() const { return m_Height; } };
|
|
|
2017/8/3 ¤U¤È 12:11:52
// ³æ¼hÄ~©Ó class B :public PROTOTYPE_BASE_CRTP(Prototype_ROOT) { // ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override { v->Visit(this); }
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override { return new B(*this); }
// ¨°ª int m_Weight;
protected: // ¥ÃÄòÀx¦s virtual void Save(ostream &save) override { save << m_Weight << ' '; } virtual void Load(istream &load) override { load >> m_Weight; }
public: B(int Weight) { m_Weight = Weight; } B(const B &Src) { m_Weight = Src.m_Weight; } virtual ~B() {}
int GetWeight() const { return m_Weight; } };
// ¦h¼h³æ¤@Ä~©Ó class C :public PROTOTYPE_BASE_CRTP(A) { // ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override { v->Visit(this); }
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override { return new C(*this); }
// ¦~¬ö int m_Age;
protected: // ¥ÃÄòÀx¦s virtual void Save(ostream &save) override { A::Save(save); save << m_Age << ' '; } virtual void Load(istream &load) override { A::Load(load); load >> m_Age; }
public: C(int Age, int Height) :A(Height) { m_Age = Age; } C(const C &Src) :A(Src) { m_Age = Src.m_Age; } virtual ~C() {}
int GetAge() const { return m_Age; } };
|
|
|
2017/8/3 ¤U¤È 12:13:07
// ¦h«Ä~©Ó class D :public PROTOTYPE_BASE_CRTP(A), public PROTOTYPE_BASE_CRTP(B) { // ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override { v->Visit(this); }
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override { return new D(*this); }
// ¦~¬ö int m_Age;
protected: // ¥ÃÄòÀx¦s virtual void Save(ostream &save) override { A::Save(save); B::Save(save); save << m_Age << ' '; } virtual void Load(istream &load) override { A::Load(load); B::Load(load); load >> m_Age; }
public: D(int Age, int Height, int Weight) :A(Height), B(Weight) { m_Age = Age; } D(const D &Src) :A(Src), B(Src) { m_Age = Src.m_Age; } virtual ~D() {}
int GetAge() const { return m_Age; } };
void Visitor::Visit(A *a) { cout << "§Ú¬O class A\n" << "¨°ª " << a->GetHeight() << endl << endl; }
void Visitor::Visit(B *b) { cout << "§Ú¬O class B\n" << "Åé« " << b->GetWeight() << endl << endl; }
void Visitor::Visit(C *c) { cout << "§Ú¬O class C\n" << "¦~¬ö " << c->GetAge() << '\n' << "¨°ª " << c->GetHeight() << endl << endl; }
void Visitor::Visit(D *d) { cout << "§Ú¬O class D\n" << "¦~¬ö " << d->GetAge() << '\n' << "¨°ª " << d->GetHeight() << '\n' << "Åé« " << d->GetWeight() << endl << endl; }
int main() { Visitor v;
Prototype *A_Obj = new A(180); Prototype *B_Obj = new B(100); Prototype *C_Obj = new C(50,170); Prototype *D_Obj = new D(40, 175, 98);
A_Obj->Accept(&v); B_Obj->Accept(&v); C_Obj->Accept(&v); D_Obj->Accept(&v);
Prototype *D_Obj2 = D_Obj; cout << "½Æ»s¤H... \n"; D_Obj2->Accept(&v);
Prototype *Big_Obj = new D(2000, 5000, 3000); stringstream persistent; Big_Obj->Save(persistent); D_Obj2->Load(persistent); cout << "°½¤Ñ´«¤é... \n"; D_Obj2->Accept(&v);
return 0; }
|
|
|
2017/8/3 ¤U¤È 12:14:57
°õ¦æµ²ªG¡G
§Ú¬O class A ¨°ª 180
§Ú¬O class B Åé« 100
§Ú¬O class C ¦~¬ö 50 ¨°ª 170
§Ú¬O class D ¦~¬ö 40 ¨°ª 175 Åé« 98
½Æ»s¤H... §Ú¬O class D ¦~¬ö 40 ¨°ª 175 Åé« 98
°½¤Ñ´«¤é... §Ú¬O class D ¦~¬ö 2000 ¨°ª 5000 Åé« 3000
|
|
|
2017/8/3 ¤U¤È 12:24:18
> >>>§Ú»¡ªº¬O¹³³o¼Ë¤lªº : obj = new('Prototype'); >>>C++ ¨S¦³ª½±µ support, ¤£¹L¦³¥]¸Ë¹Lªº >> >>§A¼gªºµ{¦¡½X¥u¬O¦b«Øºcª«¥ó¡A©M Clone ¨S¦³¤°»òÃö¦è >> >>¤£¹LY§â Factory ©ñ¤J Base ¤¤¡AClone ®É´N¥Î³o >>Ó Factory¡A³oˤ]¬O¤@Ó¤èªk > >§Ú·Q»¡¦³ÂI¥X¨Ó new object ªº¤è¦¡«á, clone ¤]¥i¥H¤p×§ï´N±o¥X¨Ó¤F
§Aªº¤èªk¨Ã¤£¬O¬°¦h¼h±j¨î¹ê§@¡A¤£¹L§Aµ¹§Ú¤FÆF·P¡AÅý§Ú°µ¥X¨Ó¤F¡A·PÁÂ
|
|
|
2017/8/3 ¤U¤È 01:20:02
³o¸Ì¼g¿ù¤F¡An§ï¤@¤U
> Prototype *D_Obj2 = D_Obj; > cout << '½Æ»s¤H...\n'; > D_Obj2->Accept(&v);
Prototype *D_Obj2 = D_Obj->Clone(); cout << "½Æ»s¤H... \n"; D_Obj2->Accept(&v);
|
|
|
2017/8/3 ¤U¤È 03:15:25
¦³À°¨ì´N¦n. ¦³®ÉÔ¥i¯à¥d¦b¬YÓ°ÝÃDÂI¤W, ¦ýÂàÓ¤è¦V»¡¤£©wÁÙ¦³¨ä¥L solution.
|
|
|
2017/8/4 ¤U¤È 06:21:52
×§ï¥Dn¬[ºc¦p¤U¡A×§ï«á¥iÁ×§K Prototype ª½±µ³Q𦆻©Ó
template <typename classification> class Prototype_CRTP;
class Prototype_ROOT;
class Prototype { // Constructor ©ñ³o¸Ì¬°¤F¤£³Qª½±µÄ~©Ó Prototype() {} public: virtual ~Prototype() {}
// ¥ÃÄòÀx¦s virtual void Save(ostream &save) = 0; virtual void Load(istream &load) = 0;
// ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() = 0; friend class Prototype_ROOT; };
// Prototype ©µ¦ùÃþ§OnÄ~©Óªº³Ì¤W¼hÃþ§O class Prototype_ROOT { // µ¹ class Prototype_CRTP<> ¥Îªº // ¥H¨ú±oÄ~©Ó Prototype ªºÅv¤O class Prototype_R :public Prototype { public: Prototype_R() {} ~Prototype_R() {} };
public:
Prototype_ROOT() {} ~Prototype_ROOT() {}
template <typename classification> friend class Prototype_CRTP; };
// ¬°¤F¥i¥H±j¨î¹ê§@¤Î¦h«Ä~©Ó template <typename classification> class Prototype_CRTP : virtual public Prototype_ROOT::Prototype_R { public: Prototype_CRTP() {} ~Prototype_CRTP(){} };
#define PROTOTYPE_BASE_CRTP(Base) Base,public Prototype_CRTP<Base>
|
|
|
2017/8/5 ¤W¤È 06:52:47
§Ú¥Ç¶Ì¤F¡APrototype_CRTP n¦A«Å§i¤@¦¸¯ÂµêÀÀ¨ç¼Æ¤£¯à¬Ù
// ¬°¤F¥i¥H±j¨î¹ê§@¤Î¦h«Ä~©Ó template <typename classification> class Prototype_CRTP : virtual public Prototype_ROOT::Prototype_R { protected: // ¥ÃÄòÀx¦s virtual void Save(ostream &save) override = 0; virtual void Load(istream &load) override = 0;
// ±µ¦¬³X°ÝªÌª«¥ó¡A±N¦Û¤v¶Çµ¹³X°ÝªÌ virtual void Accept(Visitor *v) override = 0;
// ¨ú±o©M¹êÅ骫¥ó¬Û¦Pªºª«¥ó virtual Prototype *Clone() override = 0;
public: Prototype_CRTP() {} ~Prototype_CRTP(){} };
|
|
|
2017/11/5 ¤U¤È 11:32:41
>§Ú»¡ªº must ¬O¬°¤F¥²¶·n¹ê§@¡B§ï¼gªºµêÀÀ¨ç¼Æ¦Ó¥[ªº¡A¹ï©ó¤£¶·¤@©wn¹ê§@¡B >§ï¼gªºµêÀÀ¨ç¼Æµwn¥[¤W must ¤~»¡¤£n¹ê§@¡A³o¬Oµ{¦¡ûªº¿ù¡A¤£n¥h©Ç must ¦n¤[¨S¨Ó³o¸Ì¤F¡A¤£À³¸Ó»¡¦n¤[¨S¸Iµ{¦¡¤F¡C¬Ý¤F¤@¬Ý¡Aµo²{¦Û¤v¤w¨S¿ìªk±qÀY¬Ý¨ì§À¡C¬Ý¨ì¤@¥b¨SÅé¤O¬Ý¤U¥h¤F¡A©Ò¥HY¦^ÂЦ³«ÂЩΤv¦³°Q½×¹L¡A´N¥ý»¡Án©êºp¡C ¥ý»¡²{¹ê¥@¬É±¡ªp¡A¦Ñª¨¯d¤U¤F¿ò²£µ¹¨à¤l¡A¨ä¤¤¥]¬A¤@àw¨®¡C¦ý¿òÅñ§h©J¨à¤l¡A©Ò¦³ªº¿ò²£³£¥i¥H¦Û¥Ñ¨Ï¥Î³B¤À¡A°ß¿W¨º¤@àw¨®¤l§A¤£¯à¨Ï¥Î©M³B¤À¡C§A¤@©wn¦Û¦æÁÈ¿ú¶R ¤@½ø¦Û¤vªº¨®¡C ·Q·Q¬Ý¡A³o¦X²z¶Ü? ¨à¤l¥i¯àªº¨âºØ¤ÏÀ³: 1.§Ú¤£¯à¨Ï¥Î©M³B¤À¡A¨ºµ¹§Ú·F¹À¡A§A´N§â¦Û¤v¸Ë¶i¨®¤l¤@°_®I¨ì¤g¸Ìºâ¤F¡C 2.¤£µ¹§Ú¥Î¤]´Nºâ¤F¡A§Ú¤S¤£¶}¨®¡A·F¹À¹G§Ú¤@©wn¶R¨®?
¦^¨ìC++¥@¬É¡A (¹ïÀ³)1.Y¤£µ¹¤lÃþ§O¨Ï¥Î¡A´N«Å§iprivate´N¦n¤F¡C (¹ïÀ³)2.¬Jµ¹Ä~©Ó´N¤£n¹w³]¤lÃþ§O¹ïÄ~©ÓªºªF¦è¨Ï¥Î¤è¦¡(®Ú¥»¤£¥Î¡A×§ï©Î§¹¥þ§ï¼g)¡C
¹ïC¤jÁ|ªºclone¨Ò¤l¡A°òÃþ§O§Æ±æÄ~©ÓªÌ¤@©wn§ï¼g¦Û¤vªºclone¡C ¦pªG¤lÃþ§OÄ~©Ó³oÓ°òÃþ§O¡AµM«á¥u¬O¥[¤F¤@Ó©Mclone§¹¥þµLÃöªº¨ç¦¡¦¨û¡A¬°¤°»òn±j¢¥¦§ï¼gclone? §Ú¬Ý¤F¬Ý¡A¹ê¦b¤]¤£¬OÓ±j¢¤lÃþ§O¤@©wn¹ê§@¦Û¤vªºcloneªº¦n²z¥Ñ¡C
|
|
|
2017/11/7 ¤U¤È 06:32:44
>¹ïC¤jÁ|ªºclone¨Ò¤l¡A°òÃþ§O§Æ±æÄ~©ÓªÌ¤@©wn§ï¼g¦Û¤vªºclone¡C >¦pªG¤lÃþ§OÄ~©Ó³oÓ°òÃþ§O¡AµM«á¥u¬O¥[¤F¤@Ó©Mclone§¹¥þµLÃöªº¨ç¦¡¦¨û¡A¬°¤°»òn±j¢¥¦§ï¼gclone? >§Ú¬Ý¤F¬Ý¡A¹ê¦b¤]¤£¬OÓ±j¢¤lÃþ§O¤@©wn¹ê§@¦Û¤vªºcloneªº¦n²z¥Ñ¡C
§Ú¥u¬O²³æªí¹F·N«ä¡A¨Ò¤l¤£¬O¼g±o«Ü§¹¥þ¡A§Ú¤w§ï¥Î ¤¶±Ä~©Ó+²Õ¦X¥N´ÀÄ~©Ó ¸Ñ¨M¤F³oÓ°ÝÃD¡A°Ñ¦Ò¥H¤U³o¨â½g
http://www.programmer-club.com.tw/ShowSameTitleN/c/46928.html http://www.programmer-club.com.tw/ShowSameTitleN/c/46930.html
|
|
|
2017/11/7 ¤U¤È 09:49:30
>§Ú¥u¬O²³æªí¹F·N«ä¡A¨Ò¤l¤£¬O¼g±o«Ü§¹¥þ¡A§Ú¤w§ï¥Î ¤¶±Ä~©Ó+²Õ¦X¥N´ÀÄ~©Ó ¸Ñ¨M¤F³oÓ°ÝÃD¡A°Ñ¦Ò¥H¤U³o¨â½g ¥i¤£¥i¥H°µ±o¨ì¨Ã¤£¬O§ÚÃö¤ßªº¡C§Ú¤ñ¸û¬O·Qª¾¹D³o»Ý¨Dªº¦X²z©Ê( ©Î»¡»Ýn©Ê)¡C ¨Ò¦p§Ú´£ªº¨Ò¤l¡A¤lÃþ§O¥u¥[¤F¤@Ó¸òcloneµLÃöªº¦¨û¨ç¦¡¡A¬°¦ó¤@©wn±j¨î¹ê§@¥t¤@Óclone¡C
|
|
|
2017/11/8 ¤U¤È 02:24:57
À³¸Ó¨S¨º»òÃø²z¸Ñ¡A§Ú¦A¼gӧ󲳿ªº¨Ò¤l
#include <iostream> #include <string>
using namespace std;
class Base { public: ¡@virtual Base *Clone() ¡@{ ¡@¡@return new Base(*this); ¡@} };
class Derived1 :public Base { ¡@string m_Name; public: ¡@Derived1(const string &Name) ¡@¡@:m_Name(Name) ¡@{ ¡@}
¡@Derived1(const Derived1 &Src) ¡@¡@:m_Name(Src.m_Name) ¡@{ ¡@}
¡@virtual Base *Clone() ¡@{ ¡@¡@return new Derived1(*this); ¡@}
¡@void Show() ¡@{ ¡@¡@cout << "I am Derived1. My name is " << m_Name << endl; ¡@} };
class Derived2 :public Base { ¡@string m_Name; public: ¡@Derived2(const string &Name) ¡@¡@:m_Name(Name) ¡@{ ¡@}
¡@Derived2(const Derived2 &Src) ¡@¡@:m_Name(Src.m_Name) ¡@{ ¡@}
¡@void Show() ¡@{ ¡@¡@cout << "I am Derived2. My name is " << m_Name << endl; ¡@} };
int main() { ¡@Base *pBase1 = new Derived1("coco"); ¡@Base *clone_pBase1 = pBase1->Clone(); ¡@Derived1 *pDerived1 = dynamic_cast<Derived1*>(pBase1); ¡@pDerived1->Show(); // I am Derived1. My name is coco ¡@pDerived1 = dynamic_cast<Derived1*>(clone_pBase1); ¡@pDerived1->Show(); // I am Derived1. My name is coco
¡@Base *pBase2 = new Derived2("sunyear"); ¡@Base *clone_pBase2 = pBase2->Clone(); ¡@Derived2 *pDerived2 = dynamic_cast<Derived2*>(pBase2); ¡@pDerived2->Show(); // I am Derived2. My name is sunyear ¡@pDerived2 = dynamic_cast<Derived2*>(clone_pBase2); ¡@pDerived2->Show(); // ·í±¼
¡@return 0; }
¤§©Ò¥H·|¥X¿ù¬O¦]¬° C++ ªºµêÀÀ¨ç¼Æ¥u¬OÅý©µ¦ùªÌ"¥i¥H"Âмg¡A©Ò¥H¶·n¤@ÓÃöÁä¦r must¡A¥Î¥Hªí¥ÜY¦³©µ¦ùªÌ¤@©wnÂмg
|
|
|
2017/11/8 ¤U¤È 02:54:03
¥H¤U¬O§ï¼g¦¨ ¤¶±Ä~©Ó+²Õ¦X¥N´ÀÄ~©Ó ªºª©¥»
#include <memory> #include <iostream> #include <string>
using namespace std;
class IBase { public: ¡@virtual IBase *Clone() = 0; };
class Base:public IBase { public: ¡@virtual IBase *Clone() override ¡@{ ¡@¡@return new Base(*this); ¡@} };
class IDerived1 :public IBase { public: ¡@virtual void Show() = 0; };
class Derived1 :public IDerived1 { ¡@shared_ptr<IBase> Base_Ptr; ¡@string m_Name;
public: ¡@Derived1(const string &Name) ¡@¡@:Base_Ptr(new Base), // ³o¸Ì¥u¬O¹ÏÓ¤è«K¡ADerived1 ¤£À³¸Ó»{ÃÑ Base ¡@¡@m_Name(Name) ¡@{ ¡@}
¡@Derived1(const Derived1 &Src) ¡@¡@:Base_Ptr(Src.Base_Ptr->Clone()), ¡@¡@m_Name(Src.m_Name) ¡@{ ¡@}
¡@virtual IBase *Clone() override ¡@{ ¡@¡@return new Derived1(*this); ¡@}
¡@void Show() override ¡@{ ¡@¡@cout << "I am Derived1. My name is " << m_Name << endl; ¡@} };
int main() { ¡@shared_ptr<IBase> Base1_Ptr(new Derived1("coco")); ¡@shared_ptr<IBase> clone_Base1_Ptr( Base1_Ptr->Clone()); ¡@shared_ptr<Derived1> Derived1_Ptr = dynamic_pointer_cast<Derived1>(Base1_Ptr); ¡@Derived1_Ptr->Show(); // I am Derived1. My name is coco ¡@Derived1_Ptr = dynamic_pointer_cast<Derived1>(clone_Base1_Ptr); ¡@Derived1_Ptr->Show(); // I am Derived1. My name is coco ¡@ ¡@return 0; }
|
|
|
2017/11/9 ¤W¤È 07:41:49
>>§Ú¥u¬O²³æªí¹F·N«ä¡A¨Ò¤l¤£¬O¼g±o«Ü§¹¥þ¡A§Ú¤w§ï¥Î ¤¶±Ä~©Ó+²Õ¦X¥N´ÀÄ~©Ó ¸Ñ¨M¤F³oÓ°ÝÃD¡A°Ñ¦Ò¥H¤U³o¨â½g >¥i¤£¥i¥H°µ±o¨ì¨Ã¤£¬O§ÚÃö¤ßªº¡C§Ú¤ñ¸û¬O·Qª¾¹D³o»Ý¨Dªº¦X²z©Ê( ©Î»¡»Ýn©Ê)¡C >¨Ò¦p§Ú´£ªº¨Ò¤l¡A¤lÃþ§O¥u¥[¤F¤@Ó¸òcloneµLÃöªº¦¨û¨ç¦¡¡A¬°¦ó¤@©wn±j¨î¹ê§@¥t¤@Óclone¡C
³o¬O¥Ln°µ prototype ¸ò visitor pattern ªº½t¬G ³o¨âÓ¼Ò¦¡ªº¯S©Ê clone() ¸ò accept() ³£¥²¶·µ¹¥X this object ªº static type ¦]¦¹·|µo²{«Ü¦h¤lÃþ§Oªº¹ê§@¤º®e¤@¼Ë¡A¥u¦³³oÓ this type ·|¤£¦P Åܦ¨¤£¯à¥h´_¥Î¤÷Ãþ§Oªº¹ê§@¤º®e
°ÝÃD´N¥X¦b¥L쥻ªº°ÝÃD¬O¡A¦b prototype & visitor ³£¦b²Ä¤T¥Nªº«e´£¤U ·|¦]¬°²Ä¤G¥Nªº¹ê§@¡A¥¢¥h±j¨î«¼g clone() ¸ò accept() ªº§@¥Î¡A¾ÉP¤F µ{¦¡¤£¹w´Áªº¿ù»~¦Ó¤£¦Ûª¾¡AµM«á²£¥Í°ÝÃD¡G¬°¤°»ò»y¨¥¤£´£¨Ñ must ¡H
µM«á¤@¶}©l´N¦b°Q½×»¡À³¸Ó§ïÅÜÄ~©Ó¬[ºc´N¤£·|¦³³o°ÝÃD ²{¦b§ï¤¶±Ä~©Ó¥[²Õ¦X´N¬O³o¼Ë§@¤F¡A»P¥»¨Ó°í«ùªº°ÝÃD¤w¸gµLÃö
|
|
|
2017/11/22 ¤W¤È 01:20:31
>À³¸Ó¨S¨º»òÃø²z¸Ñ¡A§Ú¦A¼gӧ󲳿ªº¨Ò¤l >#include <iostream> >#include <string> > >using namespace std; > >class Base >{ >public: >¡@virtual Base *Clone() >¡@{ >¡@¡@return new Base(*this); >¡@} >}; >:::::::::::::::::::::::::::::::::::::::::::: >class Derived2 :public Base >{ >¡@string m_Name; >public: >¡@Derived2(const string &Name) >¡@¡@:m_Name(Name) >¡@{ >¡@} > >¡@Derived2(const Derived2 &Src) >¡@¡@:m_Name(Src.m_Name) >¡@{ >¡@}
>¡@void Show() >¡@{ >¡@¡@cout << "I am Derived2. My name is " << m_Name << endl; >¡@} >}; > >int main() >{ >::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: >¡@Base *pBase2 = new Derived2("sunyear"); >¡@Base *clone_pBase2 = pBase2->Clone(); >¡@Derived2 *pDerived2 = dynamic_cast<Derived2*>(pBase2); >¡@pDerived2->Show(); // I am Derived2. My name is sunyear >¡@pDerived2 = dynamic_cast<Derived2*>(clone_pBase2); >¡@pDerived2->Show(); // ·í±¼ > >¡@return 0; >} > >¤§©Ò¥H·|¥X¿ù¬O¦]¬° C++ ªºµêÀÀ¨ç¼Æ¥u¬OÅý©µ¦ùªÌ"¥i¥H"Âмg¡A©Ò¥H¶·n¤@ÓÃöÁä¦r must¡A¥Î¥Hªí¥ÜY¦³©µ¦ùªÌ¤@©wnÂмg
¤§©Ò¥H¿ù¬O¦]¬°Derived2¦h¤F¤@Ó m_Nameªº¦¨û¡C ¼¶¼gDerived2µ{¦¡®É¡A¥»¨Ó´NÀ³¸Ó¦bclonet³dm_Nameªº½Æ»s¡C½Ö¥Íªº«Ä¤l½Ö´Nnt³d¾i¡C ¦Ó§Ú«e±´£¥Xªº°ÝÃD¬O¡AY¤lÃþ§O¨S¼W¥[¸òclone ¦³ÃöªºªF¦è¡A¬°¤°»òn³Q±j¢¹ê§@? ¤Þ¥Î§AªºBase¨Ò¤l¡A class Derived3 :public Base { public: ¡@ShowString(const string &Str) ¡@{cout <<Str<< endl;} }; ³o¨Ò¤lDerived3¬°¤°»ò n³Q±j¢¹ê§@¦Û¤vªºclone?
¦A¤Þ¥Î§AªºDerived1¬°¨Ò¤l class Derived4 :public Derived1 { public: ¡@JustSayHello(const string &Name) ¡@{cout <<"Hello "<<Name<<'!'<< endl;} };
³o¨Ò¤lDerived4¬°¤°»ò n³Q±j¢¹ê§@¦Û¤vªºclone?
¾ã²z¤@¤U§Úªº·N«ä¡A§Aªº¨Ò¤lDerived1,Derived2¸Ó¦³¦Û¤vªºclone,¦ýDerived3,Derived4«h¤£»Ýn¡C n¤£n¦³¦Û¤vªºclone¡AÀ³¥Ñµ{¦¡û¦Û¦æ§PÂ_¡A¦Û¤vªº«Ä¤l¦Û¤v¾i¡A¿àµ¹¤÷¥À·íµM¥X°ÝÃD¡C¦ýY³»«È¤@±Ú¡A¨S¥Í«Ä¤l¤£¥Îµw©ê¤@Ó°²«½«½¨Ó¾i§a?
|
|
|
2017/11/22 ¤W¤È 11:49:47
¨º¼Ë dynamic_cast ±N·|±o¨ì null
|
|
|
2017/11/23 ¤W¤È 01:03:05
>¨º¼Ë dynamic_cast ±N·|±o¨ì null ¤£À´§Aªº·N«ä¡C
|
|
|
2017/11/23 ¤W¤È 10:00:23
clone ´N¬On¥þ³¡½Æ»s¡AY¤£Âмg´N¥u·| clone ¤W¥b³¡¡A¤U¥b³¡¤£¨£¤F¡A¦ÛµM dynamic_cast<Derived3> ´N·|±o¨ì NULL
|
|
|
2017/11/27 ¤W¤È 03:18:02
>clone ´N¬On¥þ³¡½Æ»s¡AY¤£Âмg´N¥u·| clone ¤W¥b³¡¡A¤U¥b³¡¤£¨£¤F¡A >¦ÛµM dynamic_cast<Derived3> ´N·|±o¨ì NULL ¨º¨Ã¤£¬O½Æ»s¤£§¹¥þ©ÒP(½Æ»s¬O§¹¥þªº)¡Adynamic_cast·|±o¨ìnull¬O¦]¬°¦V¤UÂ૬®É«¬§OÀˬd¨S³q¹L¡C ³oºØ¤£¦P¶¥¼h«¬§Oª«¥ó¾Þ§@¡AÀ³¸Ó³£¨Ï¥Î¤¶±«¬§OIBaseªº¤¶±¥h¾Þ§@¡C¤SÂà¦^l¥Í«¬§O¾Þ§@¥»¨Ó´NѦMÀI©Ê¡C ¦pªG¦³¤°»ò¯S§O²z¥ÑnÂà¦^l¥Í«¬§O¾Þ§@¡A¥un½T©w¬O¨ºÓl¥Í«¬§O(§Aªº¨Ò¤l¬O½T©wªº)¡A¥i¥H¥Îstatic_castÂ૬¡A´N¥i¥HÁ×§K«¬§OÀˬd¡C ¨ºY¬O¤£½T©w¬O¨ºÓl¥Í«¬§O...°ÝÃD½ÆÂø¤FÂI... °ò¥»¤W§Aªº¨Ò¤l¡Adynamic_cast¤]¬On½T©w«¬§O¤~¯àcastªº¡A¤£µM±o¨ìnull¡A¤U±ªºµ{¦¡¤]¬On¥X°ÝÃDªº¡C ¤]´N¬O»¡¡A¤£½T©w¬O¨ºÓl¥Í«¬§Oªºª¬ªp¡Aµ{¦¡ÁÙn¥h³B²z±o¨ìnull®É«ç»ò¿ì¡C°õ¦æ®É´Á dynamic_cast¥»´Nn¥I¤@ÂI¥N»ùªº¡A ¦A¥[¤WÀˬd¥¢±Ñªº³B²z¡Aµ¥©ó¥I¨â¥÷¥N»ùªºµ²ªG¡Aˤ£¦p¦bIBase¸Ì¦h¤@ÓWhoAmI()ªº¤¶±¡A¤]¬O¥i¥H°ÊºAÀˬd«¬§O¡A¦ý¥uªá¤@¥÷¥N»ù¡C ¥[¤WWhoAmI()ªº«¬§OÀˬd«á¦Astatic_cast ´N¦w¥þ¤F¡C¦p¤ß¸ÌÁÙ¬O¤ò¤òªº(¤£«H¥ôWhoAmI)¡A·íµM¥i¥HWhoAmI()¤À¬£¨ì¬ÛÀ³ªºdynamic_cast¦A°µ½T»{Àˬd¡C ¥u¬O³o´N¤Sªá¤F¨â¥÷¥N»ù¤F¡C Á`¦Ó¨¥¤§¡A¦w¥þ¬On¥I¥N»ùªº¡C
|
|
|
2017/11/27 ¤U¤È 04:57:16
>>clone ´N¬On¥þ³¡½Æ»s¡AY¤£Âмg´N¥u·| clone ¤W¥b³¡¡A¤U¥b³¡¤£¨£¤F¡A >>¦ÛµM dynamic_cast<Derived3> ´N·|±o¨ì NULL >¨º¨Ã¤£¬O½Æ»s¤£§¹¥þ©ÒP(½Æ»s¬O§¹¥þªº)¡Adynamic_cast·|±o¨ìnull¬O¦]¬°¦V¤UÂ૬®É«¬§OÀˬd¨S³q¹L¡C
Y½Æ»s¬O§¹¥þªº¡A¨º¥H¤U³oµ{¦¡½Xªº¥»´L©M¤À¨´N·|±o¨ì¬Û¦Pªºµ²ªG¤F
Base *pBase2 = new Derived2("sunyear"); // ¥»´L Base *clone_pBase2 = pBase2->Clone(); // ¤À¨ Derived2 *pDerived2 = dynamic_cast<Derived2*>(pBase2); pDerived2->Show(); // I am Derived2. My name is sunyear pDerived2 = dynamic_cast<Derived2*>(clone_pBase2); pDerived2->Show(); // ·í±¼
>³oºØ¤£¦P¶¥¼h«¬§Oª«¥ó¾Þ§@¡AÀ³¸Ó³£¨Ï¥Î¤¶±«¬§OIBaseªº¤¶±¥h¾Þ§@¡C¤SÂà¦^l¥Í«¬§O¾Þ§@¥»¨Ó´NѦMÀI©Ê¡C >¦pªG¦³¤°»ò¯S§O²z¥ÑnÂà¦^l¥Í«¬§O¾Þ§@¡A¥un½T©w¬O¨ºÓl¥Í«¬§O(§Aªº¨Ò¤l¬O½T©wªº)¡A¥i¥H¥Îstatic_castÂ૬¡A´N¥i¥HÁ×§K«¬§OÀˬd¡C
§Ú¥u¬O¥Î dynamic_cast ¨ÓÃÒ©ú clone_pBase2 ¦] Derived2 ¨S¦³½Æ¼g Clone() ·|³y¦¨½Æ»s¤£§¹¥þ¦Ó¤w¡A¨S¦³n³o¼Ë¨Ï¥Î
|
|
|
2017/11/27 ¤U¤È 05:30:25
>Y½Æ»s¬O§¹¥þªº¡A¨º¥H¤U³oµ{¦¡½Xªº¥»´L©M¤À¨´N·|±o¨ì¬Û¦Pªºµ²ªG¤F >Base *pBase2 = new Derived2("sunyear"); // ¥»´L >Base *clone_pBase2 = pBase2->Clone(); // ¤À¨ >::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: >pDerived2 = dynamic_cast<Derived2*>(clone_pBase2); >pDerived2->Show(); // ·í±¼ §Ú»¡ªº¬ODerived3©µ¥Î°òÃþ§Oªºcloneªº½Æ»s¬O§¹¥þªº¡A¨S¦³»¡¬ODerived2¡C Derived2¨S¦³¼W¥[¥ô¦óªº¸ê®Æ¦¨û¡A©µ¥Î°òÃþ§Oªºclone¬O¥i¥Hªº; Derived2¦³¦Û¤v·s¼Wªº¸ê®Æ¡A·íµMn¦Û¤vÂмgclone¡C §Úªº·N«ä¬O¤lÃþ§O¨Ì¦Û¤vªº±¡ªp¨M©wn¤£nÂмgclone¡A¤£À³¸Ó³Q±j¢¤@©wnÂмg¡C¹³Derived3´N¤£»ÝnÂмg¡C
>§Ú¥u¬O¥Î dynamic_cast ¨ÓÃÒ©ú clone_pBase2 ¦] Derived2 ¨S¦³½Æ¼g Clone() ·|³y¦¨½Æ»s¤£§¹¥þ¦Ó¤w¡A¨S¦³n³o¼Ë¨Ï¥Î ¤£¬O½Æ»s¤£§¹¥þ¡C¨º¬O¦]¬°¨S¨SÂмgclone¦Ó¤÷Ãþ§O»s³yªº¬OBaseª«¥ó¡Adynamic_cast·|Àˬd¨äÃþ§O¶¥¼h¦Ócast¥¢±Ñ¡C §Aªº¨Ò¤l¡A¨Ï¥Îstatic_cast´N¤£·|¦³°ÝÃD¡A¦p¦]½Æ»s¤£§¹¥þ¡A¨ºstatic_cast´N¤@¼Ë·|¦³°ÝÃD¡C §Úª¾¹D³o¥u¬OÓ¨Ò¤l¡A©Ò¥H§Ú°²³]¤F¤£½T©wÃþ§O±¡ªpªº³B²z¡C
|
|
|
2017/11/27 ¤U¤È 05:34:15
q¥¿: Derived3¨S¦³¼W¥[¥ô¦óªº¸ê®Æ¦¨û¡A©µ¥Î°òÃþ§Oªºclone¬O¥i¥Hªº; Derived2¦³¦Û¤v·s¼Wªº¸ê®Æ¡A·íµMn¦Û¤vÂмgclone¡C
|
|
|
2017/11/27 ¤U¤È 07:52:36
Y§¹¥þ½Æ»s°õ¦æµ²ªGÀ³¸Ó¬Û¦P
#include <iostream> #include <string>
using namespace std;
class Base { public: ¡@virtual Base *Clone() ¡@{ ¡@¡@return new Base(*this); ¡@} };
class Derived3 :public Base { public: ¡@virtual Base *Clone() override¡@ ¡@{ ¡@¡@return new Derived3(*this); ¡@} };
class Derived4 :public Base { public: };
int main() { ¡@Base *pBase3 = new Derived3; // ¥»´L ¡@Base *clone_pBase3 = pBase3->Clone(); // ¤À¨
¡@cout << "Derived3 ¥»´L¡G"; ¡@if (dynamic_cast<Derived3*>(pBase3)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << "Derived3 ¤À¨¡G"; ¡@if (dynamic_cast<Derived3*>(clone_pBase3)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << endl;
¡@Base *pBase4 = new Derived4; // ¥»´L ¡@Base *clone_pBase4 = pBase4->Clone(); // ¤À¨
¡@cout << "Derived4 ¥»´L¡G"; ¡@if (dynamic_cast<Derived4*>(pBase4)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << "Derived4 ¤À¨¡G"; ¡@if (dynamic_cast<Derived4*>(clone_pBase4)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@return 0; }
°õ¦æµ²ªG¡G Derived3 ¥»´L¡G§¹¥þ Derived3 ¤À¨¡G§¹¥þ
Derived4 ¥»´L¡G§¹¥þ Derived4 ¤À¨¡G¤£§¹¥þ ½Ð«ö¥ô·NÁäÄ~Äò . . .
|
|
|
2017/11/27 ¤U¤È 09:14:13
>¡@if (dynamic_cast<Derived4*>(clone_pBase4)) >¡@¡@cout << "§¹¥þ" << endl; >¡@else >¡@¡@cout << "¤£§¹¥þ" << endl; §A¨S¦³©ú¥Õ§Úªº·N«ä¡C dynamic_cast¬O¤@Ó·|°ÊºA§PÂ_¬O§_¦w¥þ¦V¤UÂ૬(Safe downcasting¡^ªºcasting¤£¬O§PÂ_½Æ»s§¹¤£§¹¥þ¡C ¹ï©óDerived4¡A¦]¬O¨Ï¥Î°òÃþ§O¨Ó½Æ»s¦Û¤v¡A©Ò¤vª«¥ó쥻«¬ºA·|¬O°òÃþ§O¡A¦bdynamic_cast·íµM·|³Q§PÂ_«Dªk¡C (¹ïdynamic_cast¨Ó»¡¡A¥u¦³l¦ùÃþ§O°Âà°òÃþ§Oªºª«¥ó¦AÂà¦^l¦ùÃþ§O¤~¬O¦w¥þªº) ¦ý¨Æ¹ê¤WDerived4ª«¥ó©M¨ä°òÃþ§O¸ê®Æ¨S¤°»ò¤£¦P(¤º®eª«§¹¥þ¬Û¦P)¡A¤¬Âà¬O¤£»ù¦³°ÝÃDªº¡Aµ{¦¡û¥unclone_pBase4¨¥÷¬O½T©wªº¡C ¨º»ò Derived4 *pClone4= static_cast<Derived4*>(clone_pBase4); µM«ápClone4§¹¥þ¥i¥H·í§@ Derived4ªºª«¥ó¨Ó¥Î¡A¤£·|¦³½Æ»s§¹¤£§¹¥þªº°ÝÃD¡C
|
|
|
2017/11/27 ¤U¤È 10:27:01
¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M if (dynamic_cast<Derived4*>(clone_pBase4)) ¡@cout << "¦w¥þÂ૬" << endl; else ¡@cout << "¤£¦w¥þÂ૬" << endl;
ª`·N: "(¤£)¦w¥þ" ¤£¬O "(¤£)§¹¥þ" ©Ò¿×"¤£¦w¥þ"¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C ¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C
|
|
|
2017/11/28 ¤U¤È 06:27:17
>¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M >if (dynamic_cast<Derived4*>(clone_pBase4)) >¡@cout << '¦w¥þÂ૬' << endl; >else >¡@cout << '¤£¦w¥þÂ૬' << endl; > >ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' >©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C ¥u¦³§¹¥þ©Î¤£§¹¥þ¡A¨S¦³¤£¦w¥þ³oºØ¨Æ¡A ÀËÅ礣³q¹L´N¬O Blog() ¨SÂмg©Î¬O¼g¿ù¤F
>¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C ¥Ñ Base Âà¨ì Derived ¶Ü¡An¬O¦h«Ä~©Ó¤£¤@©w·|¦¨¥\
|
|
|
2017/11/28 ¤U¤È 06:54:01
>¥u¦³§¹¥þ©Î¤£§¹¥þ¡A¨S¦³¤£¦w¥þ³oºØ¨Æ¡A >ÀËÅ礣³q¹L´N¬O Blog() ¨SÂмg©Î¬O¼g¿ù¤F ©Ò¥Hstatic_castÀ³¸Ó¬OC++ªº¤@Óbug :D
|
|
|
2017/11/28 ¤U¤È 09:04:59
>©Ò¥Hstatic_castÀ³¸Ó¬OC++ªº¤@Óbug :D static_cast ¨Ì¿àªº¬O½s;¹ªº¯à¤O¡A¥un¤£¥Î´c·d¤âªk¡A¯à¹L±o¤FÀ³¸Ó¨S°ÝÃD
|
|
|
2017/11/29 ¤W¤È 12:09:51
>static_cast ¨Ì¿àªº¬O½s;¹ªº¯à¤O¡A¥un¤£¥Î´c·d¤âªk¡A¯à¹L±o¤FÀ³¸Ó¨S°ÝÃD dynamic_cast ¤~¬O¨Ì¿à½s;¹ªº¯à¤O§a? ¥¦¬O¨Ì¿àRTTI ªºtype informationÀˬddowncastªº¦w¥þ©Ê¡C ¨S¤°»ò¤£¦n(ÁöµM¦³¤H»{¬°¡A¦nªºC++µ{¦¡¤£À³¸Ó¥Îdynamic_cast )¡A¦ý¦³©ú©ú¥i¥HÂ઺ªF¦è¡A¥¦·|Âण°Ê¡C ³o®É´N¬Ostatic_cast¤W³õ¡Astatic_castªºÁô§t·N¸q´N¬O¡A§Úª¾¹D³oÂ૬OK¨S°ÝÃD¡A¤£nÀ°§ÚÀˬd¡Aµ²ªG§Ú¦Û¤vt³d¡C ¦³¨ÇªF¦è·|¬O³oºØ±¡ªp(¹³¬O³q°T¤¶±µ{¦¡)¡Adynamic_cast ¹L¤£¤F¡A¥u¦³¥Îstatic_cast¤~¥i¥H¡C static_cast<Derived4*>(clone_pBase4)¥i¥HÂ૬(¦]¬°¬O¤@¼Ëªº¸ê®Æ¦¨û)¡A¨Ï¥Î¤]¨S¦³°ÝÃD¡C¦pªG¤@©w°í«ùdynamic_cast¤~¬O¹ïªº¡A¨ºstatic_cast´NµL¥ÎªZ¤§¦a¤F¡C
|
|
|
2017/11/29 ¤U¤È 09:16:20
>>static_cast ¨Ì¿àªº¬O½s;¹ªº¯à¤O¡A¥un¤£¥Î´c·d¤âªk¡A¯à¹L±o¤FÀ³¸Ó¨S°ÝÃD >dynamic_cast ¤~¬O¨Ì¿à½s;¹ªº¯à¤O§a?
§Ú·N«ä¬O»¡ static_cast ¬O¦b½sͮɴÁ¥Ñ½s;¹´NÂà´«¦nªº¡Adynamic_cast ¬O¦b°õ¦æ®É´Á¥Ñ RTTI ¬d§ä¥X¨Óªº
>¥¦¬O¨Ì¿àRTTI ªºtype informationÀˬddowncastªº¦w¥þ©Ê¡C >¨S¤°»ò¤£¦n(ÁöµM¦³¤H»{¬°¡A¦nªºC++µ{¦¡¤£À³¸Ó¥Îdynamic_cast )¡A¦ý¦³©ú©ú¥i¥HÂ઺ªF¦è¡A¥¦·|Âण°Ê¡C >³o®É´N¬Ostatic_cast¤W³õ¡Astatic_castªºÁô§t·N¸q´N¬O¡A§Úª¾¹D³oÂ૬OK¨S°ÝÃD¡A¤£nÀ°§ÚÀˬd¡Aµ²ªG§Ú¦Û¤vt³d¡C >¦³¨ÇªF¦è·|¬O³oºØ±¡ªp(¹³¬O³q°T¤¶±µ{¦¡)¡Adynamic_cast ¹L¤£¤F¡A¥u¦³¥Îstatic_cast¤~¥i¥H¡C
¦³³oºØ¨Æ? ¾Ú§Ú©Òª¾¥un¯à¶¶§Q«Ø¦n RTTI ´N¤@©w¯àÂà¡AY¤£¯àÂà´N¬O¤£À³¸Ó³o¼ËÂà
>static_cast<Derived4*>(clone_pBase4)¥i¥HÂ૬(¦]¬°¬O¤@¼Ëªº¸ê®Æ¦¨û)¡A¨Ï¥Î¤]¨S¦³°ÝÃD¡C¦pªG¤@©w°í«ùdynamic_cast¤~¬O¹ïªº¡A¨ºstatic_cast´NµL¥ÎªZ¤§¦a¤F¡C
§Ú»{¬° static_cast ¤£À³¸Ó downcast¡A³o½s;¹À³¯à¾×±¼¡A¤£ª¾¬O¤°»òì¦]¤£³o¼Ë°µ
|
|
|
2017/11/29 ¤U¤È 10:18:59
>¦³³oºØ¨Æ? ¾Ú§Ú©Òª¾¥un¯à¶¶§Q«Ø¦n RTTI ´N¤@©w¯àÂà¡AY¤£¯àÂà´N¬O¤£À³¸Ó³o¼ËÂà ¦pªGdynamic_cast¥i¥H¨M©w¯à¤£¯àÂà¡A¤£¯àÂà´N¬O¿ùªº¡C¨º´Ndynamic_cast¨M©w¤@¤Á´N¦n¤F¡A¦ó¥²¦³static_cast?
>¦³³oºØ¨Æ? ¾Ú§Ú©Òª¾¥un¯à¶¶§Q«Ø¦n RTTI ´N¤@©w¯àÂà¡AY¤£¯àÂà´N¬O¤£À³¸Ó³o¼ËÂà ª«¥óY³£¬O¦b§A¦P¤@Óµ{¦¡¤U¥Í¦¨¡A·íµMı±o¤£À³¸Ó¦³³oµ¥¨Æ¡C Y¨âÓµ{¦¡(¥i¯à¦b¦P¤@Ó¨t²Î¤]¥i¯à¦b¤£¦Pªº¸Ë¸m¤U)¡A¶Ç¹L¨Óªºª«¥ó¦p¦ó³q¹Ldynamic_cast? ³o³q±`¬O¾a³q°T¨ó©w½T©w¸ê®Æµ²ºc¡AµM«á´N±jÂà¡C Á`¤£¯à»¡¦]¤£¯à³q¹Ldynamic_cast¡AµM«á»¡C++¤£¾A¦X¼¶¼g³q°T¨ó©w§a¡C ¦A¼á²M¤@¦¸¡Adynamic_cast¤£¯à³q¹L¡A¥u¬OÀË´ú¤£¯à½T»{¦w¥þ¡A¤£¬O¤@©w¬OÓ¿ù»~¡C «e±§Ú¨ºÓDerived3ªº¸ê®Æµ²ºc©MBase¬O¤@¼Ò¤@¼Ëªº¡A¥un½T©w³oÓ¡A±jÂà´N¨S°ÝÃD¡C ·íµM¥HC++ªºÆ[ÂI¡A¦b¦P¤@Óµ{¦¡¤º²£¥Íªºª«¥ó¡A°µ¨ìn±jÂण¬O¦n¨Æ¡C¦ý¦P¼Ëdynamic_cast¤]¤£¬O¦n¨Æ¡C ¦³¦¹¤@¬£»¡ªk¡AC++ªºµ{¦¡¤£À³¸Ó¥Î¨ìdynamic_cast¡C©Ò¦³¥Î¨ìdynamic_cast³£¥i¥H¥Î§Oªº¸û¦nªº¤è¦¡¸Ñ¨M¡C ³oÓ»¡ªkªº¥ß½×¤§¤@¡A¬O¦w¥þ¬Oµ{¦¡û³d¥ô¤£¬O½s;¹¡A¤£¬O½s;¹;¨ä¤G¬O¬O¦nªºµ{¦¡¬O¤£»ÝnDowncastªº¡C ¦ý¨SÅ¥¹L¨º¬£»¡ªk¡A»¡static_cast¬O¤£»Ýnªº±jÂà¡C(¦ý³o¤£¬O»¡¡A§â©Ò¦³ªºdynamic_cast§ï¦¨static_castªº·N«ä³á) ³o©M¥H«e¦³Ãögoto¸Ó¤£¸Ó¥Îªºª§Ä³¦³ÂI¹³¡A§Ú¤ñ¸û¦P·N¤£¸ÓÀݥΦӤ£¬Oµ´¹ï¤£¯à¥Î¡C
|
|
|
2017/12/1 ¤U¤È 03:15:57
>>¦³³oºØ¨Æ? ¾Ú§Ú©Òª¾¥un¯à¶¶§Q«Ø¦n RTTI ´N¤@©w¯àÂà¡AY¤£¯àÂà´N¬O¤£À³¸Ó³o¼ËÂà >¦pªGdynamic_cast¥i¥H¨M©w¯à¤£¯àÂà¡A¤£¯àÂà´N¬O¿ùªº¡C¨º´Ndynamic_cast¨M©w¤@¤Á´N¦n¤F¡A¦ó¥²¦³static_cast?
°ò¥»¤W¬Oªº¡A¦ý¦b³t«×¤W®t«Ü¤j¡A¦Ó¥B dynamic_cast ¤£·|±j¨îÂà§Î
>>¦³³oºØ¨Æ? ¾Ú§Ú©Òª¾¥un¯à¶¶§Q«Ø¦n RTTI ´N¤@©w¯àÂà¡AY¤£¯àÂà´N¬O¤£À³¸Ó³o¼ËÂà >ª«¥óY³£¬O¦b§A¦P¤@Óµ{¦¡¤U¥Í¦¨¡A·íµMı±o¤£À³¸Ó¦³³oµ¥¨Æ¡C >Y¨âÓµ{¦¡(¥i¯à¦b¦P¤@Ó¨t²Î¤]¥i¯à¦b¤£¦Pªº¸Ë¸m¤U)¡A¶Ç¹L¨Óªºª«¥ó¦p¦ó³q¹Ldynamic_cast? >³o³q±`¬O¾a³q°T¨ó©w½T©w¸ê®Æµ²ºc¡AµM«á´N±jÂà¡C
§A·Q¤Ó¦h¤F¡Adynamic_cast ¥u°µ¦P¤@Óª«¥ó¤¶±¶¡ªºÂà´«¡A¤£¬Oª«¥ó¤§¶¡ªºÂà´«
|
|
|
2017/12/1 ¤U¤È 06:17:04
>§A·Q¤Ó¦h¤F¡Adynamic_cast ¥u°µ¦P¤@Óª«¥ó¤¶±¶¡ªºÂà´«¡A¤£¬Oª«¥ó¤§¶¡ªºÂà´« ¤£¬O·Q¤Ó¦h¡A¥u¬O«ü¥X¡A¦³¨ÇÂ૬¬O¹ïªº¤]¬O¥²»Ý¡A¦ýdynamic_castµLªkµo´§§@¥Î¡C ¤£¥u¬O¦P¤@Óµ{¦¡¤º«¬§OªºÂà´«¡Adynamic_cast§P§Oªº¨Ì¾Ú¬O¦s©ñ¦bµêÀÀ¨ç¦¡ªí¸Ì±¡C Y¬OÃþ§O¨S¦³µêÀÀ¨ç¦¡¡Adynamic_cast¤]µLªkµo´§§@¥Î¡C
Á`¤§¡A¥i¤£¥i¥HÂ૬¡AÁÙ¬O¥Hµ{¦¡û§PÂ_¬°¥D¡Adynamic_cast¥u¬OÀ°ÂI¦£¡C »¡dynamic_cast¥i¥HÂ૬¦¨¥\¡A¨ºÂ૬¤@©w¬O¦w¥þªº¡A¬O¹ïªº¡C ¦ýY»¡dynamic_castÂ૬¤£¦¨¥\¡A¨ºÂ૬¤@©w¬O¿ùªº¡A¨º´N¹ïdynamic_cast¨Ì¿à¹L²`¤F¡C
|
|
|
2017/12/2 ¤U¤È 09:05:18
§Ú¬O·d¤£¥X§A»¡ªºª¬ªp¡A§A§Ë¤@ӨӬݬݡA¦b¦¹¤§«e§Ú»{¬° dynamic_cast µ´¹ï¥¿½T¡A§_«h RTTI ªº»ùȱN¤@¤i ¤§¶¡¥Ë¸Ñ¡ARTTI ¥»¨Ó´N¬O°µ class type ªºÃö«Y§PÂ_¥Îªº¡A¥²¶·nµ´¹ï¥i¾a
#include <iostream>
using namespace std;
class A1 { public: ¡@virtual ~A1() {} };
class A2 { };
class B1:public A1, public A2 { };
class B2 :public A1 { };
class C1 :public B1 { };
class C2 :public B2 { };
int main() { ¡@A1 *pA1 = new C1; ¡@ ¡@A2 *pA2 = dynamic_cast<A2*>(pA1); ¡@cout << "dynamic_cast<A2*>(pA1) pA1 is C1: " << ((pA2) ? "YES" : "NO") << endl; // YRS
//¡@C1 *pC1 = dynamic_cast<C1*>(pA2); // A2 ¨S¦³ RTTI ½sĶ¦Û°Ê¾×±¼ //¡@cout << "dynamic_cast<C1*>(pA2) pA2 is C1: " << ((pC1) ? "YES" : "NO") << endl;
¡@pA1 = new C2;
¡@pA2 = dynamic_cast<A2*>(pA1); ¡@cout << "dynamic_cast<A2*>(pA1) pA1 is C2: " << ((pA2) ? "YES" : "NO") << endl; // NO
//¡@C1 *pC1 = dynamic_cast<C1*>(pA2); // A2 ¨S¦³ RTTI ½sĶ¦Û°Ê¾×±¼ //¡@cout << "dynamic_cast<C1*>(pA2) pA2 is C2: " << ((pC1) ? "YES" : "NO") << endl;
¡@return 0; }
|
|
|
2017/12/3 ¤U¤È 09:23:48
>§Ú¬O·d¤£¥X§A»¡ªºª¬ªp¡A§A§Ë¤@Ó¨Ó¬Ý¬Ý §A¬O«ü³o¥y¸Ü:"Y¬OÃþ§O¨S¦³µêÀÀ¨ç¦¡¡Adynamic_cast¤]µLªkµo´§§@¥Î"? §Aªº¨Ò¤l¡A½s;¹¤£¬O¤v¸gµo¥X¡A¦]¨SµêÀÀ¨ç¦¡µLªk¨Ï¥Îdynamic_cast¤F¶Ü? ¦Ü©ó¦³µêÀÀ¨ç¦¡ªº±¡ªp¡A§Ú«e±Derived3ªº¨Ò¤l´N¬O°Ú¡C ¥¦¥Îstatic_cast¬O¥i¤u§@ªº¡A°õ¦æ¤]¨S°ÝÃD( ´N§A§âÃþ§O§Ë±o§ó½ÆÂø¡A°õ¦æ¤W¤£·|¦³¿ù)¡C ¦ý§An°í«ù¤£¯à¨Ï¥Îdynamic_cast´N¬O¿ùªº¡A¨º§Ú¤]¨S¿ìªk¤F¡C ©Ò¦³¥¿¦¡ªº¤å¥ó³£»¡dynamic_castÀˬd¤£¹L¬O¤£¦w¥þªº¡A¦ý³£¨S»¡Àˬd¤£¹L´N¬O¿ùªº¡C ¦Ñ®v¸ò¾Ç¥Í»¡¡A¹L°¨¸ô¨S¹D¸ô¾ÉÅ@«ü´§¥æ³q¬O¤£¦w¥þªº¡C¦b¨S¹D¸ô¾ÉÅ@¤U¡A¾Ç¥Í¥i¥H¿ï¾Ü¤£¹L°¨¸ô©Î¦Û¦æª`·N¦w¥þ¡C ¾Ç¥Í¥ª¥k¬Ý½T¹ê¨S¨Ó¨®¤F¡A¹L°¨¸ô¬O¦w¥þªº¡C¾Ç¥Í¥i¥H¿ï¾Ü¦Û¦æt³d¦w¥þ¡C
|
|
|
2017/12/6 ¤W¤È 08:54:40
>>§Ú¬O·d¤£¥X§A»¡ªºª¬ªp¡A§A§Ë¤@Ó¨Ó¬Ý¬Ý >§A¬O«ü³o¥y¸Ü:'Y¬OÃþ§O¨S¦³µêÀÀ¨ç¦¡¡Adynamic_cast¤]µLªkµo´§§@¥Î'?
¬O»¡³o¥y "©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº" ³o¥y "dynamic_cast¤£¯à³q¹L¡A¥u¬OÀË´ú¤£¯à½T»{¦w¥þ¡A¤£¬O¤@©w¬OÓ¿ù»~" ÁÙ¦³³o¥y "¦ý§An°í«ù¤£¯à¨Ï¥Îdynamic_cast´N¬O¿ùªº¡A¨º§Ú¤]¨S¿ìªk¤F"
>§Aªº¨Ò¤l¡A½s;¹¤£¬O¤v¸gµo¥X¡A¦]¨SµêÀÀ¨ç¦¡µLªk¨Ï¥Îdynamic_cast¤F¶Ü? >¦Ü©ó¦³µêÀÀ¨ç¦¡ªº±¡ªp¡A§Ú«e±Derived3ªº¨Ò¤l´N¬O°Ú¡C >¥¦¥Îstatic_cast¬O¥i¤u§@ªº¡A°õ¦æ¤]¨S°ÝÃD( ´N§A§âÃþ§O§Ë±o§ó½ÆÂø¡A°õ¦æ¤W¤£·|¦³¿ù)¡C >¦ý§An°í«ù¤£¯à¨Ï¥Îdynamic_cast´N¬O¿ùªº¡A¨º§Ú¤]¨S¿ìªk¤F¡C >©Ò¦³¥¿¦¡ªº¤å¥ó³£»¡dynamic_castÀˬd¤£¹L¬O¤£¦w¥þªº¡A¦ý³£¨S»¡Àˬd¤£¹L´N¬O¿ùªº¡C >¦Ñ®v¸ò¾Ç¥Í»¡¡A¹L°¨¸ô¨S¹D¸ô¾ÉÅ@«ü´§¥æ³q¬O¤£¦w¥þªº¡C¦b¨S¹D¸ô¾ÉÅ@¤U¡A¾Ç¥Í¥i¥H¿ï¾Ü¤£¹L°¨¸ô©Î¦Û¦æª`·N¦w¥þ¡C >¾Ç¥Í¥ª¥k¬Ý½T¹ê¨S¨Ó¨®¤F¡A¹L°¨¸ô¬O¦w¥þªº¡C¾Ç¥Í¥i¥H¿ï¾Ü¦Û¦æt³d¦w¥þ¡C
§Ú»¡ dynamic_cast<I*>(pObj) Âण¹L´N¬O¿ù¬O«ü I ³o¼h¤¶±¤£¦s¦b©ó pObj ª«¥ó¤§¤¤¡A¦Ó§Aªº¤£¦w¥þ¬O«ü´NºâÂण¹L¡AI ÁÙ¬O¦³¥i¯à¦s¦b pObj ¤¤¬O¶Ü???Y¬Oªº¸Ü´N©M§Úªº»{ª¾¬Û®t¤Ó¦h¤F¡A½Ð§A»¡²M·¡¡A³Ì¦n¯à¼g¥X¹ê»Ú¨Ò¤l
|
|
|
2017/12/6 ¤U¤È 06:05:18
>§Ú»¡ dynamic_cast<I*>(pObj) Âण¹L´N¬O¿ù¬O«ü I ³o¼h¤¶±¤£¦s¦b©ó pObj ª«¥ó¤§¤¤¡A >¦Ó§Aªº¤£¦w¥þ¬O«ü´NºâÂण¹L¡AI ÁÙ¬O¦³¥i¯à¦s¦b pObj ¤¤¬O¶Ü??? >Y¬Oªº¸Ü´N©M§Úªº»{ª¾¬Û®t¤Ó¦h¤F¡A½Ð§A»¡²M·¡¡A³Ì¦n¯à¼g¥X¹ê»Ú¨Ò¤l §Úªº¨Ò¤l¦b2017/11/22 ¤W¤È 01:20:31´N¬O¡C ¤£ª¾§Aªº"¤¶±"©M"¦s¦b"«üªº¬O¤°»ò¡A§Ú¥u¯à¸ÑÄÀ§Úªº»{ª¾: ©Ò¿×Ãþ§Oª«¥ó¡A¤À¦¨"¸ê®Æ"(§tµêÀÀ¨ç¦¡ªí)©M¨ç¦¡¡C §Ú̦b¶Ç¶Ç»¼©Î½Æ»sª«¥ó®É¡A¨Æ¹ê¤W¥u¬O¦b¶Ç»¼©Î½Æ»s"¸ê®Æ"¡C¨ç¦¡¥u¾a«¬§O¨ú¥Î¡A¨Ã¤£»Ýn¯u¥¿¶Ç»¼©Î½Æ»s¡C ¯U¸qªº»¡¡A©Ò¿×ª«¥ó«üªº¥u¬O"¸ê®Æ"¨Ã¤£§t¨ç¦¡¥»Åé¡C ©Ò¥H½T»{¸ê®Æ¦¨û(©Î»¡¸ê®Æµ²ºc)¬Û¦PªºÃþ§O¡A¬O¥i¥H¤¬Â઺¡A§Y¨Ï¦bdynamic_castµLªk¦¨¥\Â૬¡C ¥Hdocument viewªº¸ÑÄÀ¡A¤@Ódocument¥i¥H¦n´XÓ¤£¦Pªºview¡C document´N¬Oª«¥ó¸ê®Æ¡Aview´N¬OÃþ§O¨ç¦¡¡C¤£¦Pªºview¥i¥H¥H¤£¦Pªº§Î¦¡Åã¥Ü¦P¤@Óª«¥ó¸ê®Æ(¥»¤å¡A¹Ï§Î¡AÁnµ...) ¤U±¬O¤@Ó¨Ò¤l¡A¤@Ó®y¼Ðª«¥ó¡A¥i¥H¦³¦hºØ(Ãþ§O)§Î¦¡ªºªí¹F: class Coordinate { protected: double m_X; double m_Y; public: Coordinate(double x, double y) { {m_X = x, m_Y = y; } } virtual ~Coordinate() {} };
class CPoint : public Coordinate { public: void ShowPoint() { cout << "Point at (" << m_X <<','<< m_Y<<')' << endl; } };
class CTan : public Coordinate { public: void ShowTangent() { cout << "Tangent is " << (m_Y / m_X) << endl;} };
class CDrawPoint : public CPoint { public: void DrawPoint() { ShowPoint(); //Draw the point... } };
int main() { Coordinate Pt(12.0, 22.8); CPoint *pPoint = static_cast<CPoint *>(& Pt); pPoint->ShowPoint(); CTan *pTangent = static_cast< CTan *>(&Pt); pTangent->ShowTangent(); CDrawPoint *pDrawPoint = static_cast< CDrawPoint *>(&Pt); pDrawPoint->DrawPoint(); return 0; } ¥H¤W´XÓª«¥ó¬O¥i¥HÂà¨ÓÂà¥h¡A¥H¾Þ§@¦P¤@Óª«¥óªº(·Q¹³document-viewªºÆ[¤µ©À¡A¤@Ó¸ê®Æ¦³¤£¦P§Î¦¡ªº¾Þ§@)¡C ¦ý¨S¦³¤@ÓÂ૬¥i¥H¨Ï¥Îdynamic_cast¡C
|
|
|
2017/12/7 ¤W¤È 10:02:58
§A¦b¶}¤°»òª±¯º¡A§A¼gªº¨Ò¤l¤£¬O´N¦b»¡ static_cast «Ü¤£¦w¥þ¡An¥Î dynamic_cast ¤~¦w¥þ¡A§A«ç»ò¤Ï¹L¨Ó»¡
|
|
|
2017/12/7 ¤U¤È 12:40:44
>§A¦b¶}¤°»òª±¯º¡A§A¼gªº¨Ò¤l¤£¬O´N¦b»¡ static_cast «Ü¤£¦w¥þ¡An¥Î dynamic_cast ¤~¦w¥þ¡A§A«ç»ò¤Ï¹L¨Ó»¡ «ç¼Ëªº¤£¦w¥þ?¼gÓ¨Ò¤lÃÒ©ú§Úªº¨Ò¤l·|¥X¿ù¡C¤£n¤S¥Îdynamic_cast ·|return null¨Ó»¡¥¦¬O¿ùªº¡C ¨Ï¥Î·|¿ù¤~¥s¿ù¡AÀË´ú»¡¤£ª¾¬O§_¦w¥þ¤£¯à¥s¿ù¡C §Úªº¨Ò¤l¬O¦b»¡©ú: ½T»{¸ê®Æ¦¨û(©Î»¡¸ê®Æµ²ºc)¬Û¦PªºÃþ§O¡A¬O¥i¥H¤¬Â઺¡A§Y¨Ï¦bdynamic_castµLªk¦¨¥\Â૬¡C ¨º´XÓ¤¬Â઺Ãþ§O¡A¸ê®Æµ²ºc§¹¥þ¬Û¦P¡A¤¬¦³¤°»ò°ÝÃD?´N¦]dynamic_castµLªk¦¨¥\? ¥i§_§äÓ¦³»¡»¡ªA¤Oªº¤å¥ó¦³»¡¡Adynamic_castµLªk¦¨¥\Â૬ªºª«¥ó´N¤@©w¤£¯àÂà?(·|¥X¿ù) ¦pªG¥u¦³dynamic_cast¦¨¥\¤~¥i¥HÂ૬¡A´N¸ò¥»¤£À³¸Ó¦³static_cast³oªF¦è¤F¡C
|
|
|
2017/12/7 ¤U¤È 03:51:20
static_cast ¬YºØµ{«×¤W¥i¥H°µ¨ì±j¨îÂà§Î¡A±j¨îÂà§ÎÁÙ®³¥X¨Ó¤ñ¸û¦w¤£¦w¥þ...:(
#include <iostream>
using namespace std;
class Coordinate { protected: ¡@double m_X; ¡@double m_Y; public: ¡@Coordinate(double x, double y) { {m_X = x, m_Y = y; } } ¡@virtual ~Coordinate() {} };
class A :public Coordinate { ¡@int i; public: ¡@A() ¡@¡@:Coordinate(0,0) ¡@{ ¡@}
¡@void Set(double x, double y) ¡@{ ¡@¡@i = x*y; ¡@¡@m_X = x; ¡@¡@m_Y = y; ¡@} };
class B :public Coordinate { ¡@float i; public: ¡@B(double x, double y) ¡@¡@:Coordinate(x, y) ¡@{ ¡@¡@i = x*y; ¡@} ¡@void Show() ¡@{ ¡@¡@cout << m_X << " x " << m_Y << " = " << i << endl; ¡@} };
int main() { ¡@B B_Obj(2, 2); ¡@Coordinate *pCoordinate = &B_Obj;
¡@A *pA = static_cast<A*>(pCoordinate); // ´c·d¦¡±j¨îÂà§Î ¡@pA->Set(10, 10);
¡@B_Obj.Show();
¡@return 0; }
|
|
|
2017/12/8 ¤W¤È 12:09:12
>static_cast ¬YºØµ{«×¤W¥i¥H°µ¨ì±j¨îÂà§Î¡A±j¨îÂà§ÎÁÙ®³¥X¨Ó¤ñ¸û¦w¤£¦w¥þ...:( «e±¤£¬O¤@ª½±j½Õ¡Aµ{¦¡û½T©wª«¥óªº¸ê®Æµ²ºc¬O¤@¼Ëªº¡A´N¥i¥H±j¨îÂ૬¡C document viewªºÆ[©À¤]¬O¬Û¦Pªº¸ê®Æ(µ²ºc)¡A¤£¦P¾Þ§@ªºÆ[©À¡C §A¬G·N°µ¦¨¤£¦Pªº¸ê®Æ(µ²ºc)¥h±j¨îÂ૬¡AµM«áÃÒ©ústatic_cast¤£¦w¥þ¡AÁÙ¬O¤£¯à¥Î? µ{¦¡¦w¤£¦w¥þ¤£¬O¾adynamic_cast°Õ¡A´Nºâ§A°í«ù¤£¯à¨Ï¥Îstatic_cast(°£«Ddynamic_cast¥i¥H¹LÃö)¡C µ{¦¡û¤£¯à¹ï¦Û¤vt³d¡A´Nºâ¤@¥Í¤@¥@°í«ù¤£¨Ï¥Îstatic_cast¡AÁÙ¬O·|º|¬}¤@¤j°ï¡C Y¤£¯àt³d¦Û¤v¦w¥þ¡A³Ì¦ndynamic_cast¤]³£¤£n¥Î¡Adowncast¥»¨Ó´N¤£¬O¥²nªº(°ò¥»¤W³£¦³§ó¦nªº¼gªk´À¥N)¡C
|
|
|
2017/12/8 ¤U¤È 01:14:22
>>static_cast ¬YºØµ{«×¤W¥i¥H°µ¨ì±j¨îÂà§Î¡A±j¨îÂà§ÎÁÙ®³¥X¨Ó¤ñ¸û¦w¤£¦w¥þ...:( >«e±¤£¬O¤@ª½±j½Õ¡Aµ{¦¡û½T©wª«¥óªº¸ê®Æµ²ºc¬O¤@¼Ëªº¡A´N¥i¥H±j¨îÂ૬¡C >document viewªºÆ[©À¤]¬O¬Û¦Pªº¸ê®Æ(µ²ºc)¡A¤£¦P¾Þ§@ªºÆ[©À¡C
¤£ºÞ¦³¨S¦³¤@¼Ë¡A±j¨îÂ૬³£¦³¥i¯àÀ°§AÂà
>§A¬G·N°µ¦¨¤£¦Pªº¸ê®Æ(µ²ºc)¥h±j¨îÂ૬¡AµM«áÃÒ©ústatic_cast¤£¦w¥þ¡AÁÙ¬O¤£¯à¥Î? >µ{¦¡¦w¤£¦w¥þ¤£¬O¾adynamic_cast°Õ¡A´Nºâ§A°í«ù¤£¯à¨Ï¥Îstatic_cast(°£«Ddynamic_cast¥i¥H¹LÃö)¡C >µ{¦¡û¤£¯à¹ï¦Û¤vt³d¡A´Nºâ¤@¥Í¤@¥@°í«ù¤£¨Ï¥Îstatic_cast¡AÁÙ¬O·|º|¬}¤@¤j°ï¡C
static_cast ¤°»ò®ÉÔIJ¤Î¨ì¤F¦w¥þ³o»â°ì¤F¡A¥¦¥u¬O¬°¤F¹F¨ì¥Øªºªº¤â¬q¡A§A´N²n²n¥Î´N¦n¡A¥un±±ºÞ±o©yÁÙ¬O¯à§¹¦¨¥ô°È
>Y¤£¯àt³d¦Û¤v¦w¥þ¡A³Ì¦ndynamic_cast¤]³£¤£n¥Î¡Adowncast¥»¨Ó´N¤£¬O¥²nªº(°ò¥»¤W³£¦³§ó¦nªº¼gªk´À¥N)¡C
§Ú¥u¬O½T©w¥Î dynamic_cast °µ downcast ¦³µ´¹ïªº¥i«H«×¡A©Ò¥H¥Î¥¦§@¬°¥H¤W¨Ò¤lªºÀË´ú¨Ï¥Î¡A§Ú¤]«Ü¤Ö¥Î dynamic_cast¡A¥D¦]¬O¥¦¤ÓºC¤F¡A©Ò¥H¯u¥¿¥Î©óµ{¦¡ªº³£¬O¨ä¥¦¤èªk¨Ó¹ê²{
|
|
|
2017/12/8 ¤U¤È 01:50:12
>¤£ºÞ¦³¨S¦³¤@¼Ë¡A±j¨îÂ૬³£¦³¥i¯àÀ°§AÂà ©Ò¥Hµ{¦¡û½T»{¥i¥HÂà´N¥i¥H¤F¡C¤×¨ä¬Odynamic_castµLªkÂà¦ý¤£¬O¿ù»~ªº®ÉÔ¡C
>>§A¬G·N°µ¦¨¤£¦Pªº¸ê®Æ(µ²ºc)¥h±j¨îÂ૬¡AµM«áÃÒ©ústatic_cast¤£¦w¥þ¡AÁÙ¬O¤£¯à¥Î? >>µ{¦¡¦w¤£¦w¥þ¤£¬O¾adynamic_cast°Õ¡A´Nºâ§A°í«ù¤£¯à¨Ï¥Îstatic_cast(°£«Ddynamic_cast¥i¥H¹LÃö)¡C >>µ{¦¡û¤£¯à¹ï¦Û¤vt³d¡A´Nºâ¤@¥Í¤@¥@°í«ù¤£¨Ï¥Îstatic_cast¡AÁÙ¬O·|º|¬}¤@¤j°ï¡C >static_cast ¤°»ò®ÉÔIJ¤Î¨ì¤F¦w¥þ³o»â°ì¤F¡A¥¦¥u¬O¬°¤F¹F¨ì¥Øªºªº¤â¬q¡A§A´N²n²n¥Î´N¦n¡A¥un±±ºÞ±o©yÁÙ¬O¯à§¹¦¨¥ô°È ¨º¤@¥y¸ÜÅý§A¸ÑŪ¦¨static_castÔIJ¤Î¨ì¦w¥þ»â°ì? §Ú³£Á¿¤F¦h¤Ö¦¸¡Aµ{¦¡û¦Û¦æt³d¦w¥þ¡A´N¥i¥Îstatic_cast¡A¤£´Nªí©ústatic_cast ¤£·|¦b¦w¥þ¤W¦³¤°»òÀ°¦£¡Cµ{¦¡ûn¦Û¤vt³d¦w¥þ¡C
>§Ú¥u¬O½T©w¥Î dynamic_cast °µ downcast ¦³µ´¹ïªº¥i«H«×¡A©Ò¥H¥Î¥¦§@¬°¥H¤W¨Ò¤lªºÀË´ú¨Ï¥Î¡A ¥¦ªº¥i«H«×¬O¥¦½T»{¥i¥HÂà¡A°ò¥»¤W¬O¦w¥þªº¡A¦ý¤£¯àÂणªí¥Ü¬O¿ù»~ªº¡C ¤£¯àÂà¡A¥u¬Ortti¨S¦³¥¿½Tªº¸ê°T¡C
>§Ú¤]«Ü¤Ö¥Î dynamic_cast¡A¥D¦]¬O¥¦¤ÓºC¤F¡A©Ò¥H¯u¥¿¥Î©óµ{¦¡ªº³£¬O¨ä¥¦¤èªk¨Ó¹ê²{ ¤£¥u¬OºCªº°ÝÃD¡A±qÄ~©ÓÆ[©À¨Ó»¡downcast´N¤£¬O¤@Ó¦nµ{¦¡ªº¼gªk¡C §Aªºclone¨Ò¤l©M§Úcoordinateªº¨Ò¤l¡A³£¦³§ó¦X¥GC++ºë¯«ªº¼gªk¡A¤£»Ýndowncast¡C ¦ýstatic_cast«h¬O¦b¬Y¨Ç³õ¦X·|»Ýnªº¡C¨Ò¦p«e±´£¨ìªº³q°T¡C
|
|
|
2017/12/8 ¤U¤È 04:49:54
§Ú·Q¦bÂ૬³oÂI¤Wn¥ýÁ¿²M·¡¡Adynamic_cast ¬O¦bª«¥ó¦³¥]§tªº class ¤§¶¡ªºÂ૬¡ARTTI t³d°µ¦n³o¨Ç°O¿ý¡Adynamic_cast ´N¬O¦b RTTI ªº°O¿ý¤¤¬d§ä¡A¦³§ä¨ì´NÂà¨ìn¨Dªº class ³o¼h¤¶±¤W¡A¨S§ä¨ì´Nªí¥Üª«¥ó¤£¥]§t³oÓ class ªº¦¨¥÷¡A·|¦^ÂÐ NULL¡A©Ò¥H dynamic_cast «OÃÒ¥¿½T»P¦w¥þ
¤ÏÆ[±j¨îÂ૬´N¬O§â¬YÓ¸ê®Æµ²ºcn·í§@þºØ¼Ë»ª¨Ó¬Ýªº·N«ä¡A©Ò¥H int intVar = (int)floatVar ¥un½s;¹¦P·N§A³o¼ËÂà¡A§A´N¥i¥H·í§@ int ¨Ó³B²z¡A³o¥u¬O¤@ºØ¤â¬q¡A©M oo Æ[©À¤¤ªºÂ૬¬O¤£¤@¼Ë¡A¤£n¦]¬°³£¥sÂ૬¡A´N¦b¨º¸Ì³½¥Ø²V¯]
|
|
|
2017/12/8 ¤U¤È 08:55:18
>§Ú·Q¦bÂ૬³oÂI¤Wn¥ýÁ¿²M·¡¡Adynamic_cast ¬O¦bª«¥ó¦³¥]§tªº class ¤§¶¡ªºÂ૬¡ARTTI t³d°µ¦n³o¨Ç°O¿ý... ³oÓ§Aª¾§Úª¾¤j®aª¾¡A¤£»Ýn°Q½×¡C «ÂI¦b¡A Y¨SRTTI°O¿ý¡A¥i¤£¥i¥HÂà?«ç»òÂà? YRTTI°O¿ý¤£¯àÂà¡A¹ê»Ú¤W¥i¥HÂà¡AÂà¤F¤£·|¦³°ÝÃD¡A¥i¤£¥i¥HÂà?/
>©Ò¥H dynamic_cast «OÃÒ¥¿½T»P¦w¥þ dynamic_cast¤£«OÃÒ¦w¥þªºÂ૬¡Aµ{¦¡û¥i¤£¥i¥H¦Û¦æt³d©M¨M©wn¤£nÂà?
>¤ÏÆ[±j¨îÂ૬´N¬O§â¬YÓ¸ê®Æµ²ºcn·í§@þºØ¼Ë»ª¨Ó¬Ýªº·N«ä¡A©Ò¥H int intVar = (int)floatVar ¥un½s;¹¦P·N§A³o¼ËÂà¡A§A´N¥i¥H·í§@ int ¨Ó³B²z¡A ¤£¬O¡A±j¨îÂ૬·N«ä¬O¹ï¿ù©M«áªG¦Ût¡C
>³o¥u¬O¤@ºØ¤â¬q¡A©M oo Æ[©À¤¤ªºÂ૬¬O¤£¤@¼Ë¡A¤£n¦]¬°³£¥sÂ૬¡A´N¦b¨º¸Ì³½¥Ø²V¯] ¤£ª¾"³½¥Ø²V¯]"¸o¦W±q¦ó¦Ó¨Ó? ¥H«e¸ò§A°Q½×¡AÁö¦³ª§°õ¡A¦ý³£ÁÙ¦b´N¨Æ½×¨Æªº°Q½×¡C¬ðµM¦wÓ¸o¦W¡A¬O¤£¬O¸Ó°±¤î°Q½×¤F? C++ªºÂ૬¬O±qCªºÂ૬ªº§ï¨}ª©¡CÁöµM¦³ªºÂ૬ªº³W«h¯A¤Î¨ìÄ~©ÓÃö«Y¡A¦ý¤£»Ýn·d¨ì00Æ[©ÀªºÂ૬³o»ò°¶¤j§a¡C (C¤]¬O¦³Â૬³W«h¡A¥u¬O¤Ö¤FÄ~©Ó¶}Ãö«Yªº³W«h)
²¤Æª§°õÂI¡A §Ú¨º¤@Ócoordinateªºµ{¦¡¡A¤°»ò¦a¤è¦³¿ù?(¤£¬O°Q½×¦n¤£¦n³á) Y¬O¨S¦³¿ù¡A§Ú̪§°õ¤°»ò? Y¬O¦³¿ù¡A½Ð«ü¥X¨º¸Ì¿ù¡C §AYn»¡¦]¬°dynamic_cast¤£¯à³q¹L¡C ¨ºµ{¦¡ÀH§A§ï¡A¨î±ø¥ó¥u¦³Coordinateªº¤lÃþ§O¤£¯à¼W¥[¸ê®Æ¦¨û(¥]¬AµêÀÀ¨ç¦¡¦¨û)¡C Yµ{¦¡¥ô§A«ç»ò§ï¡A³£¤£¯à¨Ïµ{¦¡¦]¬°static_cast¦Ó¥X¿ù¡A¨º¬°¤°»ò»¡¥¦¿ù¡A¦Ó¤£¬Odynamic_cast¦³©Ò¤£¯à?
«e±´£¹LªºÆ[©À¡A§A¨S¥¿±¦^À³¡A¥¦¨ä¹ê¬OÃöÁä: ¤@ÓÃþ§O¤À¬°¸ê®Æ¦¨ûªº¾Þ§@¦¨û¡C ¦pªG¨âÓÃþ§O¸ê®Æ¦¨û¬Û¦Pªº¡A¨º³o¨âÓÃþ§Oªºª«¥ó¬O¥i¥H¤¬Â઺¡C §An»¡¥¦¿ù¡An¯à«ü¥X¨º¸Ì¿ù¡A¦Ó¤£¯à¥u¬O»¡dynamic_cast¤£³q¹L¡C dynamic_cast¥»¨Ó´N¦³¥¦ªº¨î¡A¨SµêÀÀ¨ç¦¡¤£¯à¹B§@¡A(¥Ø«e)¥u¯à¾aRTTIªºtype information¨ÓÀ˵ø¡A¨S¦³¿ëÃÑ¸ê®Æ¦¨ûµ²ºc¬O§_¬Û¦P¡C ©Ò¥Hdynamic_castÀˬd¤£¹L¡A´N¥u¥Nªí±qtype information¬Ý¤£¥X¥i¥HÂ૬¡A´N³o¼Ë¦Ó¤v¡A¤£¥²§âdynamic_cast´£¤É¨ì¹ï¿ù¼Ð·Ç¡C
|
|
|
2017/12/9 ¤W¤È 11:52:01
RTTI ©M±j»sÂ૬¬O¨âÓ¤£¦P»â°ìÀ³¥ÎªºªF¦è¡A¤£¯à²V¬°¤@½Í¡AY§â±j»sÂ૬§ï¦W¥sÅÜ«¬¥i¯à¦b¦r±©M·§©À¤W·|¤ñ¸û²M·¡¡A ÅÜ«¬¬O¬O¤ñ¸û§C¶¥»y¨¥ªº³B²z¤âªk¡A´N¹³²Õ¦X»y¨¥§â¤@¶ô°O¾ÐÅé·í§@þºØ type ¨Ó¬Ý«Ýªº·N¸q¬Û·í
RTTI ¬On¥Î©ó oo ³o»â°ìªºªF¦è¡A§A»¡ RTTI ¶·¦³ vTable ¤~·|¦s¦b¡A³o¤]¨S¿ìªk¡AC++ ´N³o¼Ë³]p¡A¤]¥u¦n±Ä¥Î¦³ vTable ªºµ²ºc¡A ³o¬O¤£¦P»â°ìªº°ÝÃD¡A¤£¬O C++ §Þ³Nªº°ÝÃD¡AÂ૬©MÅÜ«¬µLªk¤¬¬Û¨ú¥N
|
|
|
2017/12/9 ¤U¤È 03:28:07
>RTTI ©M±j»sÂ૬¬O¨âÓ¤£¦P»â°ìÀ³¥ÎªºªF¦è¡A¤£¯à²V¬°¤@½Í¡AY§â±j»sÂ૬§ï¦W¥sÅÜ«¬¥i¯à¦b¦r±©M·§©À¤W·|¤ñ¸û²M·¡¡A ²V¬°¤@½ÍÁÙ¬O¸ò»¡§Ú³½¥Ø²V¯]·N«ä®t¤£¦h¡C¥u¬O¦©¤@Ó³o¼Ëªº´U¤l¡A¦n¤ï¤ÞÓ§Ú¨º¸Ì³½¥Ø²V¯]ªº½×z§a? ±q¨Ó¨S»¡dynamic_cast©Mstatic_cast¬O¤@¼Ëªº¡Aª§Ä³ÂI³£¦b§Ú¨Ï¥Îstatic_castªº¦a¤è¡A§A¥Î¦]¬°dynamic_cast¤£·|³q¹L¡A©Ò¥H¬O¿ùªº§a¡C (§A§â¸Ó¥Îstatic_castªº¦a¤è¡A°í«ùn¥Îdynamic_castÂ૬¤~¦³²V¬°¤@½Íªº¶ûºÃ§a) §A§âdynamic_cast°µ°µ¹ï¿ùªº¼Ð·Ç¡A§Ú»{¬°¥¦¤£³q¹L¥uªí©ú¤£¦w¥þ¡A¨Ã¤£ªí¥Üµ{¦¡¬O¿ùªº¡Cµ{¦¡û»{¬°¬O¹ïªº¡A´N¥i¥H¥Îstatic_castÂ૬¡A§An¥sÅÜ«¬¡A¥sÅ]ªk³£¥i¥H¡C §Ú¥i¥H§â«e±©Ò¦³ªº¶K¤åstatic_cast¥þ³¡§ï¬°ÅÜ«¬¡A½×z¤£ÅÜ¡Aª§Ä³¤£ÅÜ¡A¦³¤°»ò·N¸q? ª§Ä³¬O§Ú»{¬°¨ºcoordinate¥i¥H¹B§@µL»~ªº¡C§An»¡¥¦¿ù¡An«ü¥X¦óª¬ªp¤£¯à¹B§@¡A¦Ó¤£¬O¥Hdynamic_cast¤£¯à¹L¡A©Ò¥H¤£¯à³o¼Ë¼g¡C
¥t¥~n½Í¨ì¦Wµü¹ï¿ù¡A§âstatic_castºÙ¤J±j¨îÂ૬¡A¤~¯uªº¬O¿ùªº¡C C++ªº±j¨îÂ૬¬Oreinterpret_cast static_cast¥¿½T¥sÀRºAÂ૬¡A¥¦¤]¬O¦³Àˬd¥\¯àªº¡A¥u¬OÀˬd©ó½sͶ¥¬q(Âà´«ÁÙ¬O¦b¹B¦æ¶¥¬q)¡C dynamic_cast¬Û¹ï©ó½sͶ¥¬qªºÀˬd¡A¥¦¦b¦³type information ªº±ø¥ó¤U¥i¥H¦b¹B¦æ¶¥¬q°µ¦w¥þ©ÊÀˬd
³o¨Ç¬Û«H§A³£ª¾¹D¡A½Ð¬Û«H§Ú¤]²M·¡¡C¤£n¦Ñ¬O¶¨ì¦n¹³§Ú¤£¤F³o´XÓcastªº¥\¯à¡C §Ú¨ºcoordinateªºµ{¦¡¡A°ò¦´N¬O¬Û¦Pªº¸ê®Æµ²ºc¡A¤£¦Pªº¾Þ§@¡A¨Ï¥ÎÄ~©Ó©Mstatic_cast¹ê²{¡C §Ú«e¤@½gÂФå¡A¤v²¤Æ°ÝÃDÂI¡A½Ð´N§Úªº°ÝÃD¦^ÂСA¤£n¤SÂà¨ì¦Wµü·í»P¤£·í¡C
|
|
|
2017/12/9 ¤U¤È 05:40:26
>²V¬°¤@½ÍÁÙ¬O¸ò»¡§Ú³½¥Ø²V¯]·N«ä®t¤£¦h¡C¥u¬O¦©¤@Ó³o¼Ëªº´U¤l¡A¦n¤ï¤ÞÓ§Ú¨º¸Ì³½¥Ø²V¯]ªº½×z§a?
class Coordinate { protected: ¡@double m_X; ¡@double m_Y; public: ¡@Coordinate(double x = 0, double y = 0) { {m_X = x, m_Y = y; } } ¡@virtual ~Coordinate() {} };
class CPoint : public Coordinate { public: ¡@void ShowPoint() { cout << "Point at (" << m_X << ',' << m_Y << ')' << endl; } };
int main() { ¡@Coordinate *Pt = new Coordinate; ¡@CPoint *pPoint = static_cast<CPoint *>(Pt); // ³o¥sÅܧÎ
¡@pPoint = new CPoint; ¡@Pt = pPoint; ¡@pPoint = static_cast<CPoint *>(Pt); // ³o¥sÂà§Î
¡@return 0; }
Pt ¦³¨S¦³ CPoint ¦¨¥÷«Ü«n¡A¥ý¦b³oÂç²M¡AÁ×§K¦A¦U»¡¦U¸Ü
>¥t¥~n½Í¨ì¦Wµü¹ï¿ù¡A§âstatic_castºÙ¤J±j¨îÂ૬¡A¤~¯uªº¬O¿ùªº¡C >C++ªº±j¨îÂ૬¬Oreinterpret_cast
§Úª¾¹D¡A§A´N¥ý§OºÞ³oÓ¡A¶V»¡¶V¨S¥æ¶°
|
|
|
2017/12/9 ¤U¤È 06:36:46
>Pt ¦³¨S¦³ CPoint ¦¨¥÷«Ü«n¡A¥ý¦b³oÂç²M¡AÁ×§K¦A¦U»¡¦U¸Ü ¤°»ò¦¨¥÷¡A§O¤H¤£À´¡C Y»¡¦å½tÃö«Y¡A«e±§Ú¤v¸g¸ÑÄÀ¹L¤F¡C Ãþ§O¤À¦¨¨â³¡¥÷¡A¸ê®Æ©M¾Þ§@¡C ©Ò¿×ª«¥ó¹êÅ餺®e¡A´N¬O«ü¸ê®Æ¦Ó¤v¡C¦]¬°CPointÃþ§O¨Ã¨S¦³¦Û¤vªº¸ê®Æ¦¨û¡A©Ò¥H CPointª«¥ó©MCoordinateª«¥ó(¸ê®Æµ²ºc)¬O§¹¥þ¤@¼Ëªº¡C ¬Û¦Pªºª«¥ó(¸ê®Æ)Pt¥i¥H¦b Coordinate¡A·íµM¤]¥i¥H¦bCPoint¾Þ§@¡C (¥»¨Ó³o¨âÓÃþ§O³]p³£¬O¦b¾Þ§@¬Û¦Pªº¸ê®Æ) n«ç»ò§i¶D½s;¹¡Aµ{¦¡û·Q¥ÎCPointÁÙ¬OCoordinate¾Þ§@¸ê®Æ? ¥Îstatic_cast¶K¤W¼ÐÅÒ´N¬O¤@Ӥ覡¡C ¹ï¤£¹ï¡AÅçÃÒµ{¦¡©Ò¦³ªº¥\¯àµL»~´N¬O¹ïªº¡C Pt¶K¤W¤WCPoint¼ÐÅÒ«á¡A°£¤Ftype information¸Ì±ªº¼ÐÅÒ¨SÅܤ§¥~¡A¥¦´N¬O¦Ê¤À¤§¤@¦ÊªºCPointª«¥ó¡C type information¨SÅܦ³¨S¤°»ò¼vÅT?©M¨SµêÀÀ¨ç¦¡ªºÃþ§O¤@¼Ë¡A´NRTTI¸Ìªºtype_information¤£¥i¾a¦Ó¤v¡A
|
|
|
2017/12/9 ¤U¤È 10:11:57
>CPoint *pPoint = static_cast<CPoint *>(Pt); // ³o¥sÅܧΠ>pPoint = static_cast<CPoint *>(Pt); // ³o¥sÂà§Î µM«á©O?§Ú´N¤£¤¶·N§An¥s¥¦¤°»ò¡C ¹ï§Ú¨Ó»¡¡Aµ{¦¡ÅÞ¿è´N¬O¬Û¦Pªº¸ê®Æµ²ºc¥i¥H³Q½á¤©¤£¦Pªº¾Þ§@¡C ¨Æ¹ê¤W¤]¥i¥H¹B§@µL»~¡C¦Ü©ón¥s¥¦¤°»ò¡A§Ú³£¨S·N¨£¡C
|
|
|
2017/12/9 ¤U¤È 11:55:56
> clone ´N¬On¥þ³¡½Æ»s¡AY¤£Âмg´N¥u·| clone ¤W¥b³¡¡A¤U¥b³¡¤£¨£¤F¡A¦ÛµM dynamic_cast<Derived3> ´N·|±o¨ì NULL > §Ú¥u¬O¥Î dynamic_cast ¨ÓÃÒ©ú clone_pBase2 ¦] Derived2 ¨S¦³½Æ¼g Clone() ·|³y¦¨½Æ»s¤£§¹¥þ¦Ó¤w¡A¨S¦³n³o¼Ë¨Ï
dynamic_cast (type) »P clone (data) §¹¾ã»P§_À³¸ÓÄÝ©ó¨â¥ó¤£¦Pªº¨Æ±¡ ?
>¦b¦¹¤§«e§Ú»{¬° dynamic_cast µ´¹ï¥¿½T¡A§_«h RTTI ªº»ùȱN¤@¤i >¤§¶¡¥Ë¸Ñ¡ARTTI ¥»¨Ó´N¬O°µ class type ªºÃö«Y§PÂ_¥Îªº¡A¥²¶·nµ´¹ï¥i¾a
¨º§Ú´c·d¤@¤U dynamic_cast ¦n¤F, ¦b Visual Studio 2017 with RTTI enabled, pA2 ¦³³QÂ૬
#include <stdio.h> #include <iostream>
using namespace std;
class A1 { public : int data1; public: virtual ~A1() {} virtual void Print() { cout << "A1" << endl; } };
class A2 { public: int dataC; int data1; public: virtual ~A2() {} };
class B1 :public A1 { };
class B2 : public A2 { };
int main() { A1 *pB1 = new B1; pB1->data1 = 500;
cout << (void *)pB1 << endl;
A2 *pA2 = dynamic_cast<A2*>((B2 *)pB1); if (pA2) { cout << (void *)pA2 << endl; cout << pA2->dataC << " " << pA2->data1 << endl; }
cout << "dynamic_cast<A2*>((B2 *)pB1) pA2_2 is B1: " << ((pA2) ? "YES" : "NO") << endl;
return 0; }
|
|
|
2017/12/10 ¤W¤È 01:23:01
>A2 *pA2 = dynamic_cast<A2*>((B2 *)pB1); C style cast ¬Û·í©ó C++ªº reinterpret_cast¡A¬O¤@ºØ¤£ÅU¤@¤ÁªºÂ૬¡AÂ૬«á³stype information(Y¦³ªº¸Ü)¤@¨Ö§ó§ï¡C ³o¬O¯u¥¿±j«Á¦¡Â૬¡A¤£¡A¨¥«¤F....¬O±j¨îÂ૬¡C static_cast¥¦ÁÙ¬O¦³§@¦w¥þ©ÊÀˬdªº¡A§A³o¦æµ{¦¡§ï¦¨static_cast¡A¦b½sͶ¥¬q´N·|³Q¾×¤U¨Ó: A2 *pA2 = dynamic_cast<A2*>(static_cast<B2 *>(pB1)); static_castÁÙ¬O·|§@°ò¥»¦å½tªºÀˬd¡A·íÂ૬¬O±q°òÃþÂ૬l¥ÍÃþ§O®É¡A½s;¹·|¹LÃö¡A§_«h·|¾×¤U¨Ó¡C ³oªí¥Ü¡AC++¦b³W½d®É¤vª¾¦³¨Ç°òÃþ§Oª«¥óÁö¤£¬Oì¥Í¦Ûl¥ÍÃþ§O¡A¦ý·|¦³Â૬l¥ÍÃþ§Oªº»Ýn¡C (¤£µM´N¤@Ódynamic_cast¥´³qÃö´N¦n¤F¡A·d¨º»ò¦hcast°µ¤°»ò?) §Ú¨ºCoordinate¨Ã¤£¬O´c·d¡A¦Ó¬O¨Ìstatic_castºë¯«¥h¨Ï¥Îªº¡A³o¼Ë³£³QC¤j§P¦º¸o¤F¡A §A³o¬O¥Ç¤F±j«Á¸o¡A¤£¡A¤S»¡¿ù¤F¡A¬O±j¨î¸o¡I·|³Q¥´¤J¤Q¤K¼h¦aÀ®ªº¡C«¢«¢
|
|
|
2017/12/10 ¤U¤È 12:08:16
¥h¬d¤F¤@¤U assembly code, µo²{ dynamic_cast ¬O downcasting ªº®ÉÔ, ¤~·| call __RTDynamicCast upcasting «h¬O»P static_cast ¬Û¦P, ¦b compile ¶¥¬q´N°µÀˬd¤F
#include "stdafx.h"
#include <stdio.h> #include <iostream>
using namespace std;
class A1 { public : int data1; public: virtual ~A1() {} virtual void Print() { cout << "A1" << endl; } };
class A2 { public: int dataC; int data1; public: virtual ~A2() {} };
class B1 :public A1 { };
class B2 : public A2 { };
class C1 : public B1, public B2 { };
int main() { A1 *pB1 = new B1; pB1->data1 = 500;
cout << (void *)pB1 << endl;
A2 *pA2 = dynamic_cast<A2*>((B2 *)pB1); if (pA2) { cout << (void *)pA2 << endl; cout << pA2->dataC << " " << pA2->data1 << endl; }
cout << "dynamic_cast<A2*>((B2 *)pB1) pA2_2 is B1: " << ((pA2) ? "YES" : "NO") << endl;
B1*pA1 = dynamic_cast<B1*>(pB1);
C1 *pC1 = new C1; B1 *pB1_2 = dynamic_cast<B1*>(pC1); C1 *pC1_2 = dynamic_cast<C1*>(pB1_2);
B1 *pB1_3 = static_cast<B1*>(pC1); C1 *pC1_3 = static_cast<C1*>(pB1_2);
return 0; }
; 63 : B1 *pB1_2 = dynamic_cast<B1*>(pC1);
mov rax, QWORD PTR pC1$[rbp] mov QWORD PTR pB1_2$[rbp], rax
; 64 : C1 *pC1_2 = dynamic_cast<C1*>(pB1_2);
mov DWORD PTR [rsp+32], 0 lea r9, OFFSET FLAT:??_R0?AVC1@@@8 lea r8, OFFSET FLAT:??_R0?AVB1@@@8 xor edx, edx mov rcx, QWORD PTR pB1_2$[rbp] call __RTDynamicCast mov QWORD PTR pC1_2$[rbp], rax
; 65 : ; 66 : B1 *pB1_3 = static_cast<B1*>(pC1);
mov rax, QWORD PTR pC1$[rbp] mov QWORD PTR pB1_3$[rbp], rax
; 67 : C1 *pC1_3 = static_cast<C1*>(pB1_2);
mov rax, QWORD PTR pB1_2$[rbp] mov QWORD PTR pC1_3$[rbp], rax
|
|
|
2017/12/10 ¤U¤È 12:30:48
>§Ú¨ºCoordinate¨Ã¤£¬O´c·d¡A¦Ó¬O¨Ìstatic_castºë¯«¥h¨Ï¥Îªº¡A³o¼Ë³£³QC¤j§P¦º¸o¤F¡A >§A³o¬O¥Ç¤F±j«Á¸o¡A¤£¡A¤S»¡¿ù¤F¡A¬O±j¨î¸o¡I·|³Q¥´¤J¤Q¤K¼h¦aÀ®ªº¡C«¢«¢
§O³o»ò»¡¨S~ ¹ê§@¤W¦³¥i¯à§â object ¦s¨ì list ¤W, Ū¥Xªº®ÉÔ«¬ºA cast ¿ù, ´N³y¦¨¸ú¹L¤F complier casting ªºÀˬd ©Ò¥H°£¤F¨Ì¿à compiler ªº¯à¤O¥~, programmer À³¸Ó¤]n¤F¸Ñ¦Û¤v¦b¼g¤°»ò§a. ^^
|
|
|
2017/12/10 ¤U¤È 02:36:05
>©Ò¥H°£¤F¨Ì¿à compiler ªº¯à¤O¥~, programmer À³¸Ó¤]n¤F¸Ñ¦Û¤v¦b¼g¤°»ò§a. ^^ ¥»¨Óµ{¦¡¹ï¿ù´N¬Oµ{¦¡ûnt³Ì¤jªº³d¥ô¡A´Nºâ½sͱo¹L¡A©Ò¦³ªº°ÊºAÀˬd¤]¨S°ÝÃD¡A ÁÙ¬O¥i¥H¼g¤@°ï¤£¯àworkªºÄêµ{¦¡¡C ºÉ«H®Ñ¤£¦pµL®Ñ;nºÉ«Hdynamic_cast¤£¦pµLdynamic_cast¡C dynamic_cast¤£·|¹L¡A±j¨îÂ૬¡A¥unµ{¦¡û¦Û¤vª¾¹D¦b°µ¤°»ò¨S¤°»ò¤£¥i¥H¡C
|
|
|
2017/12/10 ¤U¤È 02:38:02
>dynamic_cast ¬O downcasting ªº®ÉÔ, ¤~·| call __RTDynamicCast >upcasting «h¬O»P static_cast ¬Û¦P, ¦b compile ¶¥¬q´N°µÀˬd¤F ¹ï
|
|
|
2017/12/10 ¤U¤È 06:32:39
>>Pt ¦³¨S¦³ CPoint ¦¨¥÷«Ü«n¡A¥ý¦b³oÂç²M¡AÁ×§K¦A¦U»¡¦U¸Ü >¤°»ò¦¨¥÷¡A§O¤H¤£À´¡C
¥Î¥]¸Ë²°°µ¤ñ³ë¦n¤F¡AC ¤ñ¸û«µø¥]¸Ë²°ªº¤º®eª«¡A¤£¦b¥G¥]¸Ë²°ªø«ç¼Ë¡AC++ «h«µø¦b¥]¸Ë²°¡A¤£¦b¥G¥]ªº¬O¤°»òªF¦è ©Ò¥H§A¤@ª½ C ªºÆ[ÂI¥h¬Ý C++ ¥Ã»·¤]·d¤£²M·¡
|
|
|
2017/12/10 ¤U¤È 06:39:50
>>CPoint *pPoint = static_cast<CPoint *>(Pt); // ³o¥sÅܧΠ>>pPoint = static_cast<CPoint *>(Pt); // ³o¥sÂà§Î >µM«á©O?§Ú´N¤£¤¶·N§An¥s¥¦¤°»ò¡C >¹ï§Ú¨Ó»¡¡Aµ{¦¡ÅÞ¿è´N¬O¬Û¦Pªº¸ê®Æµ²ºc¥i¥H³Q½á¤©¤£¦Pªº¾Þ§@¡C >¨Æ¹ê¤W¤]¥i¥H¹B§@µL»~¡C¦Ü©ón¥s¥¦¤°»ò¡A§Ú³£¨S·N¨£¡C
¦b OO ªº¥@¬É𥚃¡An°Ñ»Pþ¨Ç¬¡°Ê´Nn¦³¾A·íªº¨¥÷¡A¤@Óª«¥ó¯à¤Á´«þ¨Ç¨¥÷¨M©w¤F¯à°Ñ¥[þ¨Ç¬¡°Ê¡A³o¼Ë§A¯à¤F¸ÑÅܧΩMÂà§Î·N¸qªº¤£¦P¶Ü
|
|
|
2017/12/10 ¤U¤È 07:13:55
#include <stdio.h> #include <iostream>
using namespace std;
class A1 { public: ¡@int data1; public: ¡@virtual ~A1() {} ¡@virtual void Print() ¡@{ ¡@¡@cout << "A1" << endl; ¡@} };
class A2 { public: ¡@int dataC; ¡@int data1; public: ¡@virtual ~A2() {} };
class B1 :public A1 { };
class B2 : public A2 { };
int main() { ¡@A1 *pB1 = new B1; ¡@pB1->data1 = 500;
¡@cout << (void *)pB1 << endl;
¡@A2 *pA2 = dynamic_cast<A2*>((B2 *)pB1); ¡@if (pA2) ¡@{ ¡@¡@cout << (void *)pA2 << endl; ¡@¡@cout << pA2->dataC << " " << pA2->data1 << endl; ¡@}
¡@cout << "dynamic_cast<A2*>((B2 *)pB1) pA2_2 is B1: " << ((pA2) ? "YES" : "NO") << endl;
¡@B2 *pB2 = dynamic_cast<B2*>(pA2); ¡@cout << "dynamic_cast<B2*>(pA2) pA2 is B1: " << ((pB2) ? "YES" : "NO") << endl; // NO
¡@return 0; }
|
|
|
2017/12/10 ¤U¤È 10:15:24
>¦b OO ªº¥@¬É𥚃¡An°Ñ»Pþ¨Ç¬¡°Ê´Nn¦³¾A·íªº¨¥÷¡A >¤@Óª«¥ó¯à¤Á´«þ¨Ç¨¥÷¨M©w¤F¯à°Ñ¥[þ¨Ç¬¡°Ê¡A³o¼Ë§A¯à¤F¸ÑÅܧΩMÂà§Î·N¸qªº¤£¦P¶Ü §Ṳ́v¸g¨â±ø¨S¥æ¶°ªº¥¦æ½u¹ï¸Ü¤F¡C ½Ðµ¹§Aªº»¡ªk¦³¤½«H¤Oªº¤å¥ó¡A§Ú̦A¨Ó°Q½×쥻¤å¥ó¬O¦b»¡¤°»ò¡C ¥t¥~¡A¤£n¦A¼G¥p¦Wµü¤F¡A¦n¶Ü?§Ú³£»¡¤F¡An¥s¤°»ò§Ú¨S·N¨£¡C §Ú¨ºcoordinateªºµ{¦¡¡A´N¬O¤@Ódocument¦³¦hÓ¤£¦P¾Þ§@ªº¤@ºØ¹ê²{¡C¦³¤°»ò¤£¦XOO? ¥t¤@ÓÆ[ÂI¡A´N¬O§â¸ê®Æ©M¤èªk°ÊºAªº²Õ¦X¦¨¤@Óª«¥ó¡C²Õ¦Xªº¤è¦¡¤]¦bC++¤¹³\ªº¤è¦¡¡A¦³¤°»ò¤£¦XOO? MFC³£¥i¥H°ÊºAªº²£¥Í·sªºÃþ§O¡AÃø¹D¥¦§ó¤£¦XOO¡COO½Íªº¤£¬O«ç»ò²£¥ÍÃþ§Oª«¥ó§a¡C OO¤Ó§Î¦Ó¤W¤F¡AC++¥u¬OOO¹ê²{ªº¤@ºØµ{¦¡»y¨¥¡C¦pªG§A½Íªº¬OC++ªºÃþ§O¬[ºc¡A¤U±ªº¤ÀªR¬Ý§A¯à¤£¯à»{¦P¡C ¤@Ó¨S¦³¥ô¦ó¸ê®Æ¥u¦³¨ç¦¡(¾Þ§@)ªºÃþ§O¡A¥i¥H²£¥Íª«¥ó¶Ü?(¦^ÀY¬Ý§Ú»¡ªº¡A¯U¸qªºª«¥ó«üªº¬O¸ê®Æ¤£¬O¨ç¦¡) C++¤¹³\³o¼ËªºÃþ§O²£¥Íª«¥ó¡A¦ý¨ä¹ê³o¼ËªºÃþ§O¤v¸g°h¤Æ¦¨¨ç¦¡¸s²Õªºname space¤F¡C§â¨ç¦¡¦¨û³£¼Ð¤Wstatic§¹¥þ¥i¥H·í°µname space¨Ó¨Ï¥Î¡C (³s»yªk³£¬Û¦P) §Y¨Ï¤£¼Ð¤Wstatic¡A°ò¥»¤W³o¨Ç¨ç¦¡¦¨ûªº¥»½èÁÙ¬Ostatic(³o¬O¬°¤°»ò§Ú»¡¯U¸qªºª«¥ó«üªº¬O¸ê®Æ¤£¬O¨ç¦¡¡Aª«¥ó¸Ì±®Ú¥»¨S¦³¨ç¦¡¥»Åé)¡C §A¥Î¥u¦³¨ç¦¡ªºÃþ§O²£¥Í¤@Óª«¥ó¡AC++ ¬°¤F»y¨¥¬Û®e©Ê¡AÁÙ¬O·|µ¹§A¤@Óª«¥ó¡A¦ý³oÓª«¥ó¤º®e¬O¨S·N¸qªº¡C ¥u¦³¨ç¦¡ªºÃþ§O²£¥Í¤@Óª«¥óªº«ü¼Ð¡A¥iÀH§A«ü©w¥ô¦óÈ¡A¬Æ¦Ü¬Onull¡A¥¦³£¥i¥H¹B§@µL»~¡C©Ò¥H§A¥i¥H§ânull Â૬¦¨³o¼ËªºÃþ§Oª«¥ó¥h¾Þ§@¡C ³o»¡©ú¤F¥u¦³¨ç¦¡ªºÃþ§O¤v°h¤Æ¦¨name spaceµ¥¯Åªº¨Æ¹ê¡C ¦pªG³oÓ¨S°ÝÃD¡A´N¥i¥H©¹¤U¬Ý¡C ¦pªG¦³¤@¸s¨ç¦¡¬O¥Î¨Ó¾Þ§@®y¼Ð(¦V¶q)Åã¥Ü¦¨¹Ï§Îªº¡C¥t¤@¸s¨ç¦¡¬O¥Î¨Ó¾Þ§@®y¼Ð¥»¤å»¡©úªº¡A¥t¤@¸s¨ç¦¡¬O§â®y¼Ð°µ¤T¨¤¨ç¦¡¾Þ§@........ ¥i¤£¥i¥H§â³o¨Ç¸s²Õ¨Ï¥Îname space¤Àªù§OÃþ¼Ð¥Ü¦WºÙ?³o¨S°ÝÃD§a? ¦n¤F¡A¶i¤J°ÝÃD®Ö¤ß¡C³o¨Ç®y¼Ð¾Þ§@ªº¸s²Õ¬On¾Þ§@®y¼Ð³oºØ§ÎºAªº¸ê®Æªº¡A«ç»ò¶Ç»¼¸ê®Æµ¹¨ç¨Ï¹Bºâ©Î¾Þ§@? ³o²³æ¡A´N§â®y¼Ð¸ê®Æ°µ¦¨ª«¥ó¥H¤Þ¼Æªº¤è¦¡¶Çµ¹¨ç¦¡´N¥i¥H¤F¡C ¥ØªºÁö¹F¨ì¤F¡A¦ý³o¤£¦XOOªººë¯«¬O§a¡A³Ì¥Dn¬O¨ç¦¡¨S¸j©w¸ê®Æ¡A¸ê®Æªº³sµ²ÁÙn¾a¨ä¥¦ªº¾÷¨î¥hºÞ²z¡C ¬JµMC++Ãþ§O¬O¥Ñ¨ç¦¡¥h¾Þ§@¸ê®Æ¡A¨º¬O¤£¬O§â®y¼Ðª«¥ó©M¨ç¦¡¸s²Õµ²¦X¦¨¤@ÓÃþ§O¡A³o¼Ë¨ç¦¡¸s²Õ´N¦³¤@Ó¸j©wªº¸ê®Æ¥i¥H¾Þ§@¤F? ¦ý§Ú¤S·Qn"°ÊºA"ªº«ü©w®y¼Ðn¥Î¨º¤@Ó¸s²Õ¨ç¦¡¡A«ç»ò¿ì? ¤@Áû鷄³JÀH¤ßµÛ¤ß±¡¦nÃa¡A¥i¯àn·Înª£©ÎµN(´ö) ¯à¤£¯à§â·Î³J¡Aª£³J©Î³Jªá´ö¡A¤À¦¨§÷®Æªº³J¡A©M·Î¡Aª£¡AµN¤TÓ¾Þ§@¸s²Õ? ³oºâ¬O¤£¿ùªº¥D·N¡A©Ò¥H§â®y¼Ð¸ê®Æ°µ¦¨¤@Ó¸ê®Æª«¥ó¡A¦Ó¾Þ§@ªº¨ç¦¡¸s²Õ´N¤ÀÃþ¦¨¯Â¾Þ§@Ãþ§O?(n°O±o¥u¦³¾Þ§@¨ç¦¡ªºÃþ§O¡A¬Ostatic ¾Þ§@©Ê½è¡Aª«¥ó¨S¦³·N¸q) µM«á´N¥i¥H§â®y¼Ðª«¥ó©M¾Þ§@¨ç¦¡¡A°ÊºAµ²¦X¦¨©ÒnªºÃþ§Oª«¥ó¡C¦p®y¼Ð¹Ï§ÎÅã¥Üª«¥ó¡A®y¼Ð¤T¨¤¨ç¦¡ª«¥óµ¥µ¥¡C Y¥H«e±³Jªº·Î¡Aª£¡AµNªº°ÊºAµ²¦X´N¬O·Î³J¡Aª£³J©M³Jªá´ö¡C ¦n¹³¦³ÂI¦b¸Ñ»¡decorator pattern ^^ µL½×¦p¦ó¡A³o¼Ëªº«äºû¡A©MOO¨S¤°»ò¤£¦X¤§³B¡C¥u¬O¦bC++µ²¦X§Ú¤è¦¡¬O±Ä¥ÎÂà§Î¤è¦¡¹ê²{¦Ó¤v¡C
|
|
|
2017/12/11 ¤W¤È 12:37:16
>¦b OO ªº¥@¬É𥚃¡An°Ñ»Pþ¨Ç¬¡°Ê´Nn¦³¾A·íªº¨¥÷¡A >¤@Óª«¥ó¯à¤Á´«þ¨Ç¨¥÷¨M©w¤F¯à°Ñ¥[þ¨Ç¬¡°Ê¡A³o¼Ë§A¯à¤F¸ÑÅܧΩMÂà§Î·N¸qªº¤£¦P¶Ü §An¥sstatic_cast¬OÂ૬ÁÙ¬OÅܧΡAÅ]ªkÁÙ¬O¸ÀÅÜ¡A§Ú³£¨S·N¨£¡A«ÂФF¦h¦¸¡AÁÙ¤£¯à¤F§Ú¨S¦bª§¦Wµü¶Ü? ¤£ºÞÅܧÎÁÙ¬O¸ÀÅÜ¡A³£¬O¨¥÷¤v¸g§ïÅܤF¡A¥¦ªº·s¨¥÷¥i¥H°Ñ¥[¨º¨Ç¬¡°Ê¡A¥¦´N¬O¥H¾A·íªº¨¥÷¦b°Ñ¥[¡C Y¬O¤£¯à¡A´Nºâ½sͮɍS¯à¾×¤U¡A°õ¦æ¤]·|¥X¿ù¡C
|
|
|
2017/12/11 ¤W¤È 10:41:47
>³oºâ¬O¤£¿ùªº¥D·N¡A©Ò¥H§â®y¼Ð¸ê®Æ°µ¦¨¤@Ó¸ê®Æª«¥ó¡A¦Ó¾Þ§@ªº¨ç¦¡¸s²Õ´N¤ÀÃþ¦¨¯Â¾Þ§@Ãþ§O? (n°O±o¥u¦³¾Þ§@¨ç¦¡ªºÃþ§O¡A¬Ostatic ¾Þ§@©Ê½è¡Aª«¥ó¨S¦³·N¸q) >µM«á´N¥i¥H§â®y¼Ðª«¥ó©M¾Þ§@¨ç¦¡¡A°ÊºAµ²¦X¦¨©ÒnªºÃþ§Oª«¥ó¡C¦p®y¼Ð¹Ï§ÎÅã¥Üª«¥ó¡A®y¼Ð¤T¨¤¨ç¦¡ª«¥óµ¥µ¥¡C >Y¥H«e±³Jªº·Î¡Aª£¡AµNªº°ÊºAµ²¦X´N¬O·Î³J¡Aª£³J©M³Jªá´ö¡C ³á¡A¦¤W¦A·Q¤F¤@¤U¡A§A³o»ò¤¶·N¦Wµü¡C §Ú«e±Á¿ªº¡A¾Þ§@¨ç¦¡¨Ã¤£·|¼vÅTª«¥óªº½×z¡AY§A¯à¦P·N¡C ¨º»ò¬Û¦Pªºª«¥ó¡An³Q¤£¦Pªº¯Â¾Þ§@Ãþ§O(¥u¦³¨ç¦¡ªºÃþ§O)¡A¬Û·í©óname spaceªºusing¡C ¥i±¤¡AC++»y¨¥¡A³oºØÃþname spaceªºusingªº»yªk¨Ã¤£¬Ousing¡A¥¦ÁÙ¬O¥Hcast¥h¹ê²{¡C §Ú§â«e±coordinate¥[¤Wµù¸Ñ(¥u¦³mainªºµ{¦¡)¡A³o¼Ë§A¬O§_¯àÄÀÃh? class Coordinate { protected: double m_X; double m_Y; public: Coordinate(double x, double y) { {m_X = x, m_Y = y; } } virtual ~Coordinate() {} };
class CPoint : public Coordinate { public: void ShowPoint() { cout << "Point at (" << m_X <<','<< m_Y<<')' << endl; } };
class CTan : public Coordinate { public: void ShowTangent() { cout << "Tangent is " << (m_Y / m_X) << endl;} };
class CDrawPoint : public CPoint { public: void DrawPoint() { ShowPoint(); //Draw the point... } };
int main() { Coordinate Pt(12.0, 22.8); CPoint *pPoint = static_cast<CPoint *>(& Pt);//use CPoint to operate Pt pPoint->ShowPoint(); CTan *pTangent = static_cast< CTan *>(&Pt);//use CTan to operate Pt pTangent->ShowTangent(); CDrawPoint *pDrawPoint = static_cast< CDrawPoint *>(&Pt);//use CDrawPointto operate Pt pDrawPoint->DrawPoint(); return 0; } ©Î§AÁÙ¬O¤ñ¸û³ßÅwÅܧΦWµü¡A¤]§âµù°O§ïÅܧΡAY¯à¥O¥ëº¡·N¡A§Ú¤]¨S·N¨£: nt main() { Coordinate Pt(12.0, 22.8); CPoint *pPoint = static_cast<CPoint *>(& Pt);//ÅܧΦ¨CPoint¥H¾Þ§@Pt pPoint->ShowPoint(); CTan *pTangent = static_cast< CTan *>(&Pt);//ÅܧΦ¨pTangent¥H¾Þ§@Pt pTangent->ShowTangent(); CDrawPoint *pDrawPoint = static_cast< CDrawPoint *>(&Pt);//ÅܧΦ¨CDrawPoint ¥H¾Þ§@Pt pDrawPoint->DrawPoint(); return 0; }
|
|
|
2017/12/11 ¤W¤È 11:48:28
°_¦]¬O§Ú¥Î dynamic_cast ¨ÓÀËÅç Clone() ²£¥Íªº¤À¨¬O¤£¬O¤À¨¡A ¦Ó§A»{¬°§Y¨Ï dynamic_cast ÀËÅ礣¹LÁÙ¬O¦³¥i¯à¤´¬°¤À¨¡A ²z¥Ñ³ºµM¬O¥Î static_cast ¤´µM¥i "Â૬" ¬°¤À¨¡A ¦]¦¹¤Þ¼É¹ïÂà§Îªºª§Ä³¡A©Ò¥H§Ú¤£±o¤£¥Î "ÅÜ«¬" ¨Ó©w¸q§A©Ò¿×ªºÂ૬ ¦pªG¦b³o³¡¥÷¨S¿ìªk¨ú±o¦@ÃÑ¡A¨ä¥L³£¬O¦U»¡¦U¸Ü¨S¦³·N¸q
|
|
|
2017/12/11 ¤U¤È 01:22:27
>¦Ó§A»{¬°§Y¨Ï dynamic_cast ÀËÅ礣¹LÁÙ¬O¦³¥i¯à¤´¬°¤À¨¡A >²z¥Ñ³ºµM¬O¥Î static_cast ¤´µM¥i "Â૬" ¬°¤À¨¡A §Ú±q¨Ó¨S¦³¥Î¤À¨³o¦r²´¡A¨º¬O§A¦Û¤v¹ïcast©ÎÀRºAÂ૬ªº¸ÑŪ¡C static_cast¦bC++¤¤¤å½Ķ´N¬OÀRºAÂ૬¡A¤£µM§An§Ú¥Î¤°»ò¦Wµü¡A§Ú¤]¤£¤¶·N¡C ´Nºâ¤@¶}©l§A¤£ª¾§Ú¥Î¤°»ò¦Wµü¡A§Ú³£Án©ú¨º»ò¦h¦¸§Ú¤£¤¶·N¥Î¤°»ò¦Wµü¤F¡AÁÙ¤£¤F¸Ñ¶Ü? «ÂI¤£¬O¦Wµü¡A¦Ó¬O§Ú¨ºstatic_castªºµ{¦¡¬O¬O¥i¥H¹B§@µL»~¡A¤]¦³¥¦ÅÞ¿è§t·N(¤£¬O´c·d)¡A³o¼ËÁÙ¦³¤°»ò°ÝÃD? ±q2017/11/22 ¤W¤È 01:20:31¶K¤å¶}©l <coco> ¦Ó§Ú«e±´£¥Xªº°ÝÃD¬O¡AY¤lÃþ§O¨S¼W¥[¸òclone ¦³ÃöªºªF¦è¡A¬°¤°»òn³Q±j¢¹ê§@?
µM«á§A´N¶}©l¡A¤°»ò¥u½Æ»s¤@¥b¡A½Æ»s¤£§¹¥þ¡C ±µ¤U¨Óªº°Q½×¡A´X¥G§Ú¤@ª½¦A¸ò§A¸ÑÄÀ¡Al¦ùÃþ§OY¨S¼W¥[¸òª«¥ó(¸ê®Æ)¦³ÃöªºªF¦è¡A²£¥Íªºª«¥ó´N¬O¸ò°òÃþ§Oª«¥ó¬O¤@¼Ëªº¡C ³o®É«áªº°òÃþª«¥ó==l¥Íª«¥ó¡A½Æ»s¬O§¹¥þªº¡A¨S¤°»ò¥u½Æ»s¤@¥bªº°ÝÃD¡C ¦A³oºØ±¡ªp¡A²£¥Íªº°òÃþ§Oª«¥ó(Â૬)µ¹l¥ÍÃþ§O¾Þ§@¬O¨S¦³°ÝÃDªº¡C ±µ¤U¨Óªº¤@¾ã¦ê°Q½×´X¥G¬O¡A§A¤@ª½¦b±j½Õdynamic_cast¤£¹L´N¬O¿ùªº¡C §Ú¤@ª½¸ÑÄÀ¡Adynamic_cast¤£¹L¡A¥u¬Otype information¤ñ¹ï¤£¹L¡A½s;¹¤£«OÃÒ¦w¥þ¡Aµ{¦¡ûn¦Û¦æt³d¡C §A¥i¥H¦A±q2017/11/22 ¤W¤È 01:20:31¶}©l¬Ý¡A¬O¤£¬O³£¦b³oÂI¤W¶¡C
|
|
|
2017/12/11 ¤U¤È 01:56:47
>>¦Ó§A»{¬°§Y¨Ï dynamic_cast ÀËÅ礣¹LÁÙ¬O¦³¥i¯à¤´¬°¤À¨¡A >>²z¥Ñ³ºµM¬O¥Î static_cast ¤´µM¥i 'Â૬' ¬°¤À¨¡A >§Ú±q¨Ó¨S¦³¥Î¤À¨³o¦r²´¡A¨º¬O§A¦Û¤v¹ïcast©ÎÀRºAÂ૬ªº¸ÑŪ¡C
¤À¨¬O Clone() ¥\¯à¡A³o³¡¥÷¦³°ÝÃD¶Ü
> static_cast¦bC++¤¤¤å½Ķ´N¬OÀRºAÂ૬¡A¤£µM§An§Ú¥Î¤°»ò¦Wµü¡A§Ú¤]¤£¤¶·N¡C >´Nºâ¤@¶}©l§A¤£ª¾§Ú¥Î¤°»ò¦Wµü¡A§Ú³£Án©ú¨º»ò¦h¦¸§Ú¤£¤¶·N¥Î¤°»ò¦Wµü¤F¡AÁÙ¤£¤F¸Ñ¶Ü?
§Ú¤£¬O¦b©M§Aª§¦Wµü¡A¥u¬O§A©M oo ªºÂ૬·§©À²V¦b¤@°_¤F¡A§Ú¥u¬On§â¥¦¤À³Î²M·¡
>«ÂI¤£¬O¦Wµü¡A¦Ó¬O§Ú¨ºstatic_castªºµ{¦¡¬O¬O¥i¥H¹B§@µL»~¡A¤]¦³¥¦ÅÞ¿è§t·N(¤£¬O´c·d)¡A³o¼ËÁÙ¦³¤°»ò°ÝÃD?
«ÂI´N¦b³o¤F¡A§A¯u§â¥¦²V¦b¤@°_¤F
>±q2017/11/22 ¤W¤È 01:20:31¶K¤å¶}©l ><coco> >¦Ó§Ú«e±´£¥Xªº°ÝÃD¬O¡AY¤lÃþ§O¨S¼W¥[¸òclone ¦³ÃöªºªF¦è¡A¬°¤°»òn³Q±j¢¹ê§@?
C ¥i¥H C++ ´N¬O¤£¦æ
>µM«á§A´N¶}©l¡A¤°»ò¥u½Æ»s¤@¥b¡A½Æ»s¤£§¹¥þ¡C >±µ¤U¨Óªº°Q½×¡A´X¥G§Ú¤@ª½¦A¸ò§A¸ÑÄÀ¡Al¦ùÃþ§OY¨S¼W¥[¸òª«¥ó(¸ê®Æ)¦³ÃöªºªF¦è¡A²£¥Íªºª«¥ó´N¬O¸ò°òÃþ§Oª«¥ó¬O¤@¼Ëªº¡C
¦A©ú½T§i¶D§A¡A¤£¯à³o¼Ë·d
>³o®É«áªº°òÃþª«¥ó==l¥Íª«¥ó¡A½Æ»s¬O§¹¥þªº¡A¨S¤°»ò¥u½Æ»s¤@¥bªº°ÝÃD¡C >¦A³oºØ±¡ªp¡A²£¥Íªº°òÃþ§Oª«¥ó(Â૬)µ¹l¥ÍÃþ§O¾Þ§@¬O¨S¦³°ÝÃDªº¡C >±µ¤U¨Óªº¤@¾ã¦ê°Q½×´X¥G¬O¡A§A¤@ª½¦b±j½Õdynamic_cast¤£¹L´N¬O¿ùªº¡C >§Ú¤@ª½¸ÑÄÀ¡Adynamic_cast¤£¹L¡A¥u¬Otype information¤ñ¹ï¤£¹L¡A½s;¹¤£«OÃÒ¦w¥þ¡Aµ{¦¡ûn¦Û¦æt³d¡C >§A¥i¥H¦A±q2017/11/22 ¤W¤È 01:20:31¶}©l¬Ý¡A¬O¤£¬O³£¦b³oÂI¤W¶¡C
³o«Ü«n©Ò¥Hn»¡¤T¦¸¡Aµ´¹ï¤£¯à³o¼Ë·d
oo Á¿¨s«Ê¸Ë¡A¹ï¶Â½c¸ÌªºªF¦è¤£¦b¥G¡A¤]¤£¸Ó¥h¦b¥G¡A ©Ò¥H¨âÓ class ¤º®e³£¤@¼Ò¤@¼Ë¡Aoo ÁÙ¬Onµø¬°¤£¦P¡A ©Ò¥H§A¥Î static_cast ªº¤âªk¡A°µ¬° "§Y¨Ï dynamic_cast ÀËÅ礣¹LÁÙ¬O¦³¥i¯à¤´¬°¤À¨" ªº²z¥Ñ¡A oo ¬O¤£¯à±µ¨üªº
|
|
|
2017/12/11 ¤U¤È 02:17:35
>>±q2017/11/22 ¤W¤È 01:20:31¶K¤å¶}©l >><coco> >>¦Ó§Ú«e±´£¥Xªº°ÝÃD¬O¡AY¤lÃþ§O¨S¼W¥[¸òclone ¦³ÃöªºªF¦è¡A¬°¤°»òn³Q±j¢¹ê§@? > >C ¥i¥H C++ ´N¬O¤£¦æ >
³o¬q§Ú¦^¤Ó§Ö
¥²¶·±j¢ clone() ¹ê§@ªºì¦]¬O¦]¦³·s©µ¦ùªºÃþ§O¡A´N¥²¶·nÅý¤À¨¤]n¦³¬Û¦PªºÃþ§O¡A ¤]´N¬O type ¶·¤@P¡A¤£¬O¤º®en¤@¼Ë
|
|
|
2017/12/11 ¤U¤È 02:22:11
> >>>±q2017/11/22 ¤W¤È 01:20:31¶K¤å¶}©l >>><coco> >>>¦Ó§Ú«e±´£¥Xªº°ÝÃD¬O¡AY¤lÃþ§O¨S¼W¥[¸òclone ¦³ÃöªºªF¦è¡A¬°¤°»òn³Q±j¢¹ê§@? >> >>C ¥i¥H C++ ´N¬O¤£¦æ >> > >³o¬q§Ú¦^¤Ó§Ö > >¥²¶·±j¢ clone() ¹ê§@ªºì¦]¬O¦]¦³·s©µ¦ùªºÃþ§O¡A´N¥²¶·nÅý¤À¨¤]n¦³¬Û¦PªºÃþ§O¡A >¤]´N¬O type ¶·¤@P¡A¤£¬O¤º®en¤@¼Ë > ³o¼ËÁ¿¤]¤£¹ï¡An§ï¤@¤U ¤º®e¤@¼Ë¥~¡Atype ¤]n¤@P¡A¤£µM«ç»ò·|¥s clone ^^
|
|
|
2017/12/11 ¤U¤È 03:34:51
>¤À¨¬O Clone() ¥\¯à¡A³o³¡¥÷¦³°ÝÃD¶Ü ¥un¤£µw¶ë"¤À¨"¬O§Ú»¡ªº¡A´N¨S°ÝÃD¡C «D¥²n¡A§Ú¤£³ßÅw³Ð³y¦Wµü¡A¥Î¤v©w¸q©ú½Tªº¡A¤j®aºD¥Î³£À´ªº¤ñ¸û¦n¡C ¦ý§An¥Î¡A§Ú¤£¤¶·N¡A¥un"ÅܧÎ"¦¨¬O§Ú»¡ªº´N¦n¡C ¹ï§Ú¨Ó»¡cloneÀ³¬O½Æ»s¡A½Æ»s¤°»ò?·íµM¬O½Æ»sª«¥ó¹êÅé¡A¹ï§a? ¦b§Ú2017/11/22 ¤W¤È 01:20:31¶Kªº Derived3 ªºª«¥ó¹êÅé©M Base¬O¤@¼Ò¤@¼Ëªº¡A©Ò¥H½Æ»s¤@ÓBase¹êÅéµ¹Derived3¡A¦³¤°»ò°ÝÃD¶Ü? ¦Ü©óBase¹êÅén¦p¦óÂনµ¹Derived3¾Þ§@¡A¨º¬O»yªkªº°ÝÃD¡AµLÃöOO¡C
>§Ú¤£¬O¦b©M§Aª§¦Wµü¡A¥u¬O§A©M oo ªºÂ૬·§©À²V¦b¤@°_¤F¡A§Ú¥u¬On§â¥¦¤À³Î²M·¡ OOÂ૬³W«h´N¬OA¹êÅ骺¶°¦X¥]§t©Îµ¥©óB¹êÅé¶°¦X¡A´N¥i¥HÂà¡C Derived3 ªº¹êÅ骺¶°¦X©M BaseÅé¶°¦X¬O¤@¼Ëªº¡A¬°¤°»ò¤£¯àÂà? ¬O§A¤@ª½¨S¯à§âª«¥ó¹êÅé(¸ê®Æ)©M¨ç¦¡(¾Þ§@)¦¨û¤À³Î²M·¡§a¡C
>>«ÂI¤£¬O¦Wµü¡A¦Ó¬O§Ú¨ºstatic_castªºµ{¦¡¬O¬O¥i¥H¹B§@µL»~¡A¤]¦³¥¦ÅÞ¿è§t·N(¤£¬O´c·d)¡A³o¼ËÁÙ¦³¤°»ò°ÝÃD? >«ÂI´N¦b³o¤F¡A§A¯u§â¥¦²V¦b¤@°_¤F ¸ò½Ö²V¦b¤@°_¤F?µ{¦¡µ²ºc©MÅÞ¿è³£¤ÀªRµ¹§A¤F¡A¦³¨S¦³¹HIOO¬O¬Ýµ{¦¡µ²ºc©MÅÞ¿è¡A¤£¬O¬Ý¦³¨S¦³¨Ï¥Îstatic_cast¡C static_cast¥u¬O¤â¬q¡A¤]¥i¥H¹B§@¡C´Nºâ¸ò¤°»ò²V¦b¤@°_¤]¥Ñ±o§A»¡(·d¤£²M¸ò¤°»ò²V¦b¤@°_)¡A¥un¤£»¡¥¦¬O¿ùªº¤£¯à¨Ï¥Î´N¦n¡C
>¦A©ú½T§i¶D§A¡A¤£¯à³o¼Ë·d ¤£¦n·N«ä¡AY¤£¯à³o¼Ë·d¡A¥H«e¼gªº³q°Tµ{¦¡¡A¤j·§³£Ãø²£¤F¡I ¤@Ó¦¬¨ú¸g³q°T¶Ç¨Óªº©R¥O(©Î«H®§)¡A©³¼h¥uºÞ«Ê¥]¦¬¨ú¡A¤£ºÞ¤º®e¬O¤°»ò©R¥O(©Î«H®§)¡C ³o¼Ëªº«Ê¥]°ò¥»¤W´N¬OUINT_8°}¦Cªº«ü¼Ð¡C¶Ç¨ì¤W¼h¡A·|¥ý§â¥¦±j¨îÂ૬¦¨raw data type¨Ò¦p: struct RawCmdData { UINT_8 m_Cmd://command identify UINT_8 m_Para[MAX_CMDLEN]; }; ¶Ç¨ì³Ì¤W¼h©R¥O¥O³B²zµ{§Ç®Én¨Ìm_u8Cmd¬O¨º¤@ºØ©R¥O¡A¦A±j¨îÂ૬¦¨¬Û¹ïÀ³ªº©R¥O¦C§O¡A¨Ò¦p: struct CMD_Copy { UINT_8 m_Cmd://copy command id UINT_32 m_SrcAddr; UINT_32 m_DstAddr; UINT_32 m_DataLength; } ©Î struct CMD_Write { UINT_8 m_Cmd://write command id UINT_32 m_DstAddr; UINT_32 m_DataLength; UINT_8 m_Data[MAX_CMDLEN]; } ©Î ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ½Ð°Ý¡A¦pªG¤£±j¨îÂ૬¡A§Ú«ç»ò¼gÃþ¦ü³o¼Ëªºµ{¦¡? ³q°T¶Ç¹L¨Óªº¸ê®Æ³£¤£¬Oì¥Í¦ÛRawCmdData¡A CMD_Copy©ÎCMD_Write¡C dynamic_cast³q¤£¹L(³s½sͳ£¹L¤£¤F)¡A¤£±j¨îÂ૬¡A¥Î§AªºOOPÆ[©À¡A¬On«ç»ò¼g? ³oºØª¬ªp³£¬O¸g¥Ñ³q°T¨óij¡Aµ{¦¡§PÂ_¶Ç¹L¨Óªº«Ê¥]¸ê®Æ¬OÄݩ󨺤@ºØ¸ê®Æµ²ºc¡A´N±j¨îÂ૬¡C ¦óªp§Ú«e±ªº¨Ò¤l¡A³£¬O¼gµ{¦¡®É´Nª¾ Derived3©MBase¬O¦P¤@Ó¸ê®Æµ²ºc¡A«ç·|¤£¯àÂà?
>³o«Ü«n©Ò¥Hn»¡¤T¦¸¡Aµ´¹ï¤£¯à³o¼Ë·d ¦n§a¡A§Ú¦P·NÁÙ¨Sªø¤ú¾¦¡A´N¤£n°Ù¥Ì½©¡C§Ú¥u¯à¦P·N¨ì³o¸Ì¤F¡C ¦ý«Ü©êºp¡A§Ú¼gªºµ{¦¡¦³¤@¥b¥H¤W©M³q°T¦³Ãö¡A¤£³o¼Ë¼Ë·d¡AÀ³¸Ó¦¨SÀY¸ô¤F ^^
>©Ò¥H¨âÓ class ¤º®e³£¤@¼Ò¤@¼Ë¡Aoo ÁÙ¬Onµø¬°¤£¦P¡A ¤£¬O¨âÓclass¤º®e³£¤@¼Ò¤@¼Ë¡A¦Ó¬O¨âÓclassªº¹êÅé¬O¦P¤@ÓÃþ§Oª«¥ó¡C ¦A¬Ý¤@¦¸§Úªº¨Ò¤l¡I
>©Ò¥H§A¥Î static_cast ªº¤âªk¡A°µ¬° "§Y¨Ï dynamic_cast ÀËÅ礣¹LÁÙ¬O¦³¥i¯à¤´¬°¤À¨" ªº²z¥Ñ¡A >oo ¬O¤£¯à±µ¨üªº §Ú¤£¬O³o¼Ë»¡¡A¤£n¤S§á¦±§O¤Hªº·N«ä¡C §Ú»¡ªº¬Oµ{¦¡û½T»{¨âÓÃþ§Oªºª«¥ó(¸ê®Æ¹êÅé)¬O¤@¼Ëªº¡A´N¥i¥H¤¬Âà¡C OOP¥¿½Tªº»¡ªkÀ³¬O:A¹êÅ骺¶°¦X¥]§t©Îµ¥©óB¹êÅé¶°¦X¡A´N¥i¥HAÂà§Î¦¨B¨Ó¨Ï¥Î¡C °òÃþ©Ml¥ÍÃþª«¥óªºÂ૬³W«h¡A¬O²Å¦X¤W¤@¥y³W«h¥B¬O½s;¹¥i¥HÀˬdªº¨Ò¤l¡C ¶W¥X½s;¹¥i¥HÀˬdªº½d³ò¡A¦ý¤´²Å¦X¥i¥HÂ૬ªºcase¡A´N¬Oµ{¦¡û¦Û¦æt³d¡C ¤£µM¦³ªºµ{¦¡¯uªº¼g¤£¥X¨Ó¡C
|
|
|
2017/12/11 ¤U¤È 03:50:22
>¥²¶·±j¢ clone() ¹ê§@ªºì¦]¬O¦]¦³·s©µ¦ùªºÃþ§O¡A´N¥²¶·nÅý¤À¨¤]n¦³¬Û¦PªºÃþ§O¡A ¦pªG©µ伷Ãþ§O¹êÅé©M°òÃþ¤@¼Ë©O¡A¥i¤£¥iÅý°òÃþclone´N¦n? cloneÀ³¸Ó¬O½Æ»s¸ê®ÆªºÈ¤£¬O«Ø¥ßª«¥ó¡A§A¨ºÓclone¦b²{¹ê¤¤¡AÀ³¸Ó¬On¥~³¡«Ø¥ßª«¥ó¡A¦A¥á¶iclone¥h½Æ»s¸ê®Æ¡C ·Q·Q¬Ý¡A¹ê»ÚÀ³¥Î¡Al¥ÍÃþclone¤£¯à©I¥s°òÃþªºclone¥h§¹¦¨¸ê®Æ½Æ»s¡A¨º¬O¤£¬On¥Ñl¥ÍÃþcloneÀ°°òÃþclone°µ½Æ»sªº¤u§@? ³o¦X²z¶Ü?Y°òÃþ¦³¸ê®Æ¬Oprivateªº¡A¨ºl¥ÍÃþ«ç»ò°µ°òÃþ¸Ó°µªº¤u§@¡C ³o¥»¨Ó´N¤£¬O¦X©óOOPºë¯«ªºªF¦è¡C¥u¬Oµw§Ë¤@Ó¦n¹³©Ò¦³ªºl¥ÍÃþ§O³£n¦Û¦æ¼¶¼gcloneªº¨Ò¤l¡A¦ý¹ê»Ú¤£¤Ó¥i¦æ¡A¤]¤£À³¸Ó³o¼Ë¼g¡C
|
|
|
2017/12/11 ¤U¤È 03:51:51
¤£½Í¤Ó¦h¡A´N«ÂI°Q½×
>>§Ú¤£¬O¦b©M§Aª§¦Wµü¡A¥u¬O§A©M oo ªºÂ૬·§©À²V¦b¤@°_¤F¡A§Ú¥u¬On§â¥¦¤À³Î²M·¡ >OOÂ૬³W«h´N¬OA¹êÅ骺¶°¦X¥]§t©Îµ¥©óB¹êÅé¶°¦X¡A´N¥i¥HÂà¡C
oo ªºÂ૬ªº·N«ä¬O¡AA ©Ò¥Nªíªºª«¥ó¥]§t¦³ B ³oÓ type ´N¥i¥H"¤Á´«"¹L¥h¡A§Ú¤£¬On³Ð³y¦Wµü¡A¥u¬Onªí¹F²M°£
>Derived3 ªº¹êÅ骺¶°¦X©M BaseÅé¶°¦X¬O¤@¼Ëªº¡A¬°¤°»ò¤£¯àÂà? >¬O§A¤@ª½¨S¯à§âª«¥ó¹êÅé(¸ê®Æ)©M¨ç¦¡(¾Þ§@)¦¨û¤À³Î²M·¡§a¡C
´NÂ૬¦Ó¨¥¡Aoo ¤£·|¥hºÞ¹êÅé(¸ê®Æ)©M¨ç¦¡(¾Þ§@)¡A¥unª«¥ó§t¦³·Qn type ´N¥i¥H"¤Á´«"¹L¥h
|
|
|
2017/12/11 ¤U¤È 03:55:29
>>¥²¶·±j¢ clone() ¹ê§@ªºì¦]¬O¦]¦³·s©µ¦ùªºÃþ§O¡A´N¥²¶·nÅý¤À¨¤]n¦³¬Û¦PªºÃþ§O¡A >¦pªG©µ伷Ãþ§O¹êÅé©M°òÃþ¤@¼Ë©O¡A¥i¤£¥iÅý°òÃþclone´N¦n?
¤£¦æ¡Atype ¤]n¤@P
|
|
|
2017/12/11 ¤U¤È 04:19:16
>Derived3 ªºª«¥ó¹êÅé©M Base¬O¤@¼Ò¤@¼Ëªº¡A©Ò¥H½Æ»s¤@ÓBase¹êÅéµ¹Derived3¡A¦³¤°»ò°ÝÃD¶Ü? ³o¥y¸Ü§Ú×¥¿¬°: Derived3 ªºª«¥ó¹êÅé´N¬O Base¡A©Ò¥H½Æ»s¤@ÓBase¹êÅéµ¹Derived3¡A¦³¤°»ò°ÝÃD¶Ü? §K±o§A¤S»~¸Ñ¦¨¨âÓ¤£¦PÃþÃþ§O¡A¥u¬O¤º®e¤@¼Ë¡C ¨ä¹ê¨âÓÃþ§O¡A¹êÅ餺®e¤@¼Ë¡A¤¬Âà¤]¬O¥i¥H¹B§@¡C¥u¬Oµ{¦¡³o¼Ë¼g¨S¦³·N¸q¡A¤]¬O·¥«×¤£¦n¡Astatic_cast¤]¤£·|¹L¡C ¯u¦³·Q¤£¨ìªº¦X²zÀ³¥Î¡A¨º±o¥Îreinterpret_cast¤~¯àÂà±o¤F¡C
|
|
|
2017/12/11 ¤U¤È 04:23:49
>¤£¦æ¡Atype ¤]n¤@P type ¤@PÁÙ»ÝÂ૬¶Ü? §A¬O»¡,type informationn¤@P§a? §An¯u³o»ò°í«ù¡A¨Ï¥Îreinterpret_cast¥i¥H¹F¨ì§Aªºn¨D¡C ¹ýÀY¹ý§Àªº§ï¡A³stype information³£·|¤@P¡C
|
|
|
2017/12/11 ¤U¤È 04:33:18
>oo ªºÂ૬ªº·N«ä¬O¡AA ©Ò¥Nªíªºª«¥ó¥]§t¦³ B ³oÓ type ´N¥i¥H"¤Á´«"¹L¥h¡A§Ú¤£¬On³Ð³y¦Wµü¡A¥u¬Onªí¹F²M°£ §Úªº¨Ò¤lBase ª«¥ó´N¬O¥]§t(µ¥©ó)Derived 3¡A¨º¦³¤°»ò°ÝÃD? §Ú¤@ª½¸ÑÄÀª«¥ó¬O«ü¸ê®Æ¹êÅé¡A¨ç¦¡¬O¸g¥ÑÃþ§O¿ëÃÑ¥h©I¥s¡A©Mª«¥óµLÃö¡C§A¤@ª½¤£¦^À³¡A¦ýÂФå¦n¹³¤@ª½©¿²¤³o¥ó¨Æ¡C Derived 3ªºª«¥ó¹êÅé´N¬OBase¡A¤¬Â঳¤°»ò°ÝÃD? §âBase cast¦¨Derived3ªº®ÄÀ³¥u¬O¥i¥H¨Ï¥ÎDerived3ªº¨ç¦¡¥h¾Þ§@Baseª«¥ó½}¡C
|
|
|
2017/12/11 ¤U¤È 04:47:54
>´NÂ૬¦Ó¨¥¡Aoo ¤£·|¥hºÞ¹êÅé(¸ê®Æ)©M¨ç¦¡(¾Þ§@)¡A¥unª«¥ó§t¦³·Qn type ´N¥i¥H"¤Á´«"¹L¥h ¨º¤£¬Ooo°Õ¡I ¨º¥u¬OC++ªº¦w¥þÀˬd¡A¦]¬°¥u¥Îtype information¨Ã¤£¥]¬A©Ò¦³¥i¥HÂ૬ªºª¬ªp¡A©Ò¥H¤~¦³¤À¯ÅÂ૬¡C ¥i¥HÂ૬ªºª¬ªp¡A¦ýdynamic_castÂण¹L¥h¡A´N¨Ï¥Îstatic_castÂà; ¥i¥HÂ૬ªºª¬ªp¡A¦ýstatic_castÂण¹L¥h¡A´N¨Ï¥Îreinterpret_castÂà¡C C++Â૬³W«h´N¬O³o¼Ë¡A§Aµwn»¡¥u¯àdynamic_cast¥hÂà¡AÂण¹L¥h´N¬O¤£¯àÂà¡C ¨ºC++ ¬°¦óÁÙn³]pstatic_cast©Mreinterpret_cast? ³oÓ§Ú¤]°Ý¤F¦h¦¸¡A§A±q¤£¦^µª¡C
|
|
|
2017/12/12 ¤W¤È 10:53:40
>>¤£¦æ¡Atype ¤]n¤@P >type ¤@PÁÙ»ÝÂ૬¶Ü? >§A¬O»¡,type informationn¤@P§a? >§An¯u³o»ò°í«ù¡A¨Ï¥Îreinterpret_cast¥i¥H¹F¨ì§Aªºn¨D¡C >¹ýÀY¹ý§Àªº§ï¡A³stype information³£·|¤@P¡C
§Ú¦^µªªº¬O clone() ªº¤À¨©M¥»´Ln¤@P
|
|
|
2017/12/12 ¤W¤È 10:59:16
>>oo ªºÂ૬ªº·N«ä¬O¡AA ©Ò¥Nªíªºª«¥ó¥]§t¦³ B ³oÓ type ´N¥i¥H'¤Á´«'¹L¥h¡A§Ú¤£¬On³Ð³y¦Wµü¡A¥u¬Onªí¹F²M°£ >§Úªº¨Ò¤lBase ª«¥ó´N¬O¥]§t(µ¥©ó)Derived 3¡A¨º¦³¤°»ò°ÝÃD?
§A©¿²¤¤F oo ³ÌÁ¿¨sªº type¡A¤£¬O¥u¬Ý¥]»qªº¤º®e
>§Ú¤@ª½¸ÑÄÀª«¥ó¬O«ü¸ê®Æ¹êÅé¡A¨ç¦¡¬O¸g¥ÑÃþ§O¿ëÃÑ¥h©I¥s¡A©Mª«¥óµLÃö¡C§A¤@ª½¤£¦^À³¡A¦ýÂФå¦n¹³¤@ª½©¿²¤³o¥ó¨Æ¡C >Derived 3ªºª«¥ó¹êÅé´N¬OBase¡A¤¬Â঳¤°»ò°ÝÃD? >§âBase cast¦¨Derived3ªº®ÄÀ³¥u¬O¥i¥H¨Ï¥ÎDerived3ªº¨ç¦¡¥h¾Þ§@Baseª«¥ó½}¡C
|
|
|
2017/12/12 ¤W¤È 11:08:09
>>´NÂ૬¦Ó¨¥¡Aoo ¤£·|¥hºÞ¹êÅé(¸ê®Æ)©M¨ç¦¡(¾Þ§@)¡A¥unª«¥ó§t¦³·Qn type ´N¥i¥H'¤Á´«'¹L¥h >¨º¤£¬Ooo°Õ¡I >¨º¥u¬OC++ªº¦w¥þÀˬd¡A¦]¬°¥u¥Îtype information¨Ã¤£¥]¬A©Ò¦³¥i¥HÂ૬ªºª¬ªp¡A©Ò¥H¤~¦³¤À¯ÅÂ૬¡C >¥i¥HÂ૬ªºª¬ªp¡A¦ýdynamic_castÂण¹L¥h¡A´N¨Ï¥Îstatic_castÂà; >¥i¥HÂ૬ªºª¬ªp¡A¦ýstatic_castÂण¹L¥h¡A´N¨Ï¥Îreinterpret_castÂà¡C >C++Â૬³W«h´N¬O³o¼Ë¡A§Aµwn»¡¥u¯àdynamic_cast¥hÂà¡AÂण¹L¥h´N¬O¤£¯àÂà¡C >¨ºC++ ¬°¦óÁÙn³]pstatic_cast©Mreinterpret_cast? >³oÓ§Ú¤]°Ý¤F¦h¦¸¡A§A±q¤£¦^µª¡C
©Ò¥H§Ú¤~¥ÎÅÜ«¬©MÂ૬¨Ó°µ¤À³Î¡A¨º¬O¤£¦P»â°ì¡A¤£¦P·§©À¤U´£¨Ñ¤£¦Pªº¥\¯àµ¹§A°µ¿ï¾Ü¡A¤£¯à¤¬¬Û¨ú«Ý¡A§O·d²V¤F
·Q·Q oo ªº³Ì®Ú¥»ºë¯«¬O¤°»ò¡A·Q·Q°ª¶¥»y¨¥ªº¶D¨D¬O¤°»ò¡A¦A©M§A±Ä¥Îªº§Þ³N°µ¹ï·Ó
|
|
|
2017/12/12 ¤U¤È 05:23:19
>©Ò¥H§Ú¤~¥ÎÅÜ«¬©MÂ૬¨Ó°µ¤À³Î¡A¨º¬O¤£¦P»â°ì¡A¤£¦P·§©À¤U´£¨Ñ¤£¦Pªº¥\¯àµ¹§A°µ¿ï¾Ü¡A¤£¯à¤¬¬Û¨ú«Ý¡A§O·d²V¤F ¤@¤U³½¥Ø²V¯]¡A¤@¤U¤£¯à¤¬¬Û¨ú¥N¡C§Ú¨º¸Ì³½¥Ø²V¯]? ¤£¹L´NCoordinate¨ºÓµ{¦¡¡A§Ú»{¬°¥i¥H¥Îstatic_cast¹F¦¨¥Øªº¡A§A»{¬°¤£¯à³o¼Ë·d¡A¤£¬O¶Ü? ¦Ü©ó¤¬¬Û¨ú¥N¡A¤£ª¾¦ó©Ò«ü? ¦pªG¤@Óupcast¡Aµ{¦¡û»{¬°¥Îdynamic_cast¤ñstatic_cast¥Nªº¦w¥þ©Ê¦n¡A¬°¦ó¤£¯à¨ú¥N? ¦pªG¦]¬°®Ä¯à¦Ò¶q¡Aµ{¦¡û»{¬°¥L¥i¥H¬°Âà§Ît³d¡Astatic_cast¨ú¥Ndynamic_cast¡A¤S¦³¦ó¤£¥i? ¦pªG¦bdynamic_cast³q¤£¹L¡A¦ýµ{¦¡û»{¬°Âà´«¨S¦³°ÝÃD¡A©Ò¥H¨Ï¥Îstatic_cast©Îreinterpret_cast¡A¬°¤°»ò¤£¦æ?(³oºØÂà´«¡A§An¥s¤°»ò§Ú¨S·N¨£)
>·Q·Q oo ªº³Ì®Ú¥»ºë¯«¬O¤°»ò¡A·Q·Q°ª¶¥»y¨¥ªº¶D¨D¬O¤°»ò¡A¦A©M§A±Ä¥Îªº§Þ³N°µ¹ï·Ó §ÚÌ«e±½Íªº¬OC++¡A¤£¬OOO(¤v¸g´£¥Ü¹L«Ü¦h¦¸)¡AC++¬O¨ÌOOP³W«h¦Ó¨Ó¡AOOPªº°ò·¡·íµM¬OOO¡C ±qÄ~©Ó°µ¤ñ³ë¡AOOPÄ~©Ó¦ÛOO¡AC++Ä~©Ó¦ÛOOP(¤£¾å±o³o·|¤£·|¤£Û¤£Ãþ¡A¦ýÀ³ª¾©Ò«ü) n±qOO½Í°_¤]¥i¥H¡A³oÓ°Q½×¦ê¤j·§¥i¥Hªí¹F§Ú¹ïOOªºîzÂI: http://www.programmer-club.com.tw/showSameTitleN/c/42739.html
±qOO ªºÆ[ÂI¡AÃC¦â¥i¥H¬Oª«¥ó¡A¨T¨®¤]¬Oª«¥ó¡A¨ä¤l¶°¤]¥i¥Hª«¥ó¡A¨Ãµ²¦X¦¨¥tÃþª«¥ó¡C ©Ò¥H¬õ¦â(Ä~©Ó¦ÛÃC¦â)ªº¨T¨®(Ä~©Ó¦Û¨T¨®)¬Oª«¥ó¡AÂŦ⪺¨T¨®(Ä~©Ó¦Û¨T¨®)¤]¬Oª«¥ó¡C Âà´«1.©Ò¥H¬õ¦âªº¨T¨®A¡A»¡¥¦¬O¨T¨®A(upcast)¡A·íµM¥i¥H¡C Âà´«2.¨º¨T¨®A¡A»¡¥¦¬O¬õ¦âªº¨T¨®A(Downcast)¡A¥i¤£¥i¥H?¥i¥H¡A¦]¬°¨T¨®A쥻(ì¥Í)´N¬O¬õ¦âªº¨®¤l¡C Âà´«3.¤@àw¨T¨®B(¨S¤WÃC¦â)¡A¥i¤£¥i¥H»¡¥¦¬O¬õ¦âªº¨T¨®A(Downcast)?°ò¥»¤W¤£¥i¥H¡C¦ýY¸g¤W¬õº£«á¡A´N¥i¥H¡C Âà´«4.¨º¬õ¦âªº¨T¨®»¡¥¦¬OÂŦâ¨T¨®¡A¥i¤£¥i¥H?¦n¹³¤£¥i¥H§a¡I¦ý¸g«·s¯N¤W¬õº£«á¡A¥i¤£¥i¥H? Âà´«5.¨º¬õ¦âªº¨T¨®»¡¥¦¬OÂŦ⪺¼¯¦«¨®¥i¤£¥i¥H?¤Ó§è¤F¡A¬O¤£¬O?¦ý¦pªG¬õ¦âªº¨T¨®¸g«·s§ï³y¦¨¨â½ü¾÷°Ê¨®©M¤W¬õº£©O? ·ÀI¶V©¹¤U¬O¶V°ª¡AOO¨S¦³»¡¨ºÓ¼h¯ÅªºÂà´«¤£¥i¥H¡COOÁ¿ªº¬Oµ²ºc¡Aì²z¡A¤£¬O½Í·ÀI¡C
downcast¨Ó¬ÝC++ §a¡I ¦pªG¨Ì§Aªºª«¥ó§Î§OÂà´«Æ[ÂI¡A¥u¦³Âà´«1.©MÂà´«2.¤~¬O¦Xªk¥i¦æªº¡A¨ä¥¦³£¬O´c·d§a(¦pªG§Ú¨S»~·|§Aªº·N«ä)¡C ¦ýC++ÅãµM¤£¬O¨ÌC¤jªºÆ[ÂIq©wªº¡CC casting¦bC++¤À¦¨¥|ºØcasting¡C castingªºÂ½Ä¶¡AÀ³Å±§Î©Î¶ì§Î¡A¦n¹³¥s¶ì§Î¤ñ¸û¦n(§Úı±o°Õ¡A¦ý¥Î¤°»ò§Ú¤£¤¶·N¡A¥H¤U¼È¥Î¶ì§Î)¡C ¦bC++³W½d¡Aª«¥ó§Î§OªºÂà´«ºÙ¤§¬°type conversion(¨£Standard for Programming Language C++)¤£¬O¥u¦³¶ì§Î¦Ó¤v¡A ¨ä°ò¥»ºë¯«¡Aª«¥ó§Î§O¥i¤£¥i¥HÂà´«¡Aµ{¦¡û¦³¥D±±Åv¡A¨Ã¤£¨üÂà´«1.©MÂà´«2.¡C ¨Æ¹ê¤W±qÂà´«1.¨ìÂà´«5.³£¬OC++¤¹³\ªº½d³ò¡C¶V©¹¤UªºÂà´«¡A·ÀI¶V°ª¡AÂà´«ªº·ÀI´N¬Oµ{¦¡û¦Ût¡C
Âà´«1. ´X¥G½T©w¨S¤°»ò°ÝÃD¡A©Ò¥H¥i¥HÁô¦¡Âà´«( µ{¦¡û¤£¥ÎÁn©ú¡A¦Û°ÊÂà´«)¡A¨Ò¦p: class B{}; class D:public B{}; B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´«
Âà´«2. µy¨ã·ÀI¡A©Ò¥H»ÝnÁn©úÂà´«(Åý½s;¹½T©w³o¬Oµ{¦¡ûªº¥»·N)¡AÁn©úªº¤èªk´N¬Ostatic_cast class B{}; class D:public B{}; B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´« D* pD= static_cast<D *>pB;//¦]¬°¬Odowncast¡Aµy¨ã·ÀI¡A©Ò¥Hnstatic_castÁn©ú ¦bC++¸Ì¡Aª«¥ó¸ÌY¦³type information¡Aª«¥ó§Î§O¤]¥i¥H°ÊºAÀˬd¬O§_ÄÝ©óÂà´«1.Âà´«2. class B{}; class D:public B{}; B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´« D* pD= dynamic_cast<D *>pB;// dynamic_castªº¦¨¥\¡A(¬Û¹ï¨Ó»¡)«OÃÒ¤FÂà´«¬O¦bÂà´«1.Âà´«2.ªº¬Û¹ï¦w¥þ½d³ò¤º¡C
Âà´«3. ´N¬O¥»°Q½×¦ê©MC¤jª§Ä³³Ì¤[ªº¨Ò¤l¡A¨ä¹ê¥¦¤ñÂà´«4.©MÂà´«5.¬Û¹ï¦w¥þ«Ü¦h¡A¯uªº¤£ª¾¹D¬°¤°»ò¥i¥Hª§½×¨º»ò¦h½g´T¡C class B{}; class D:public B{};//D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û B *pB= new B; D* pD= static_cast<D *>pB;//¦]¬°D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û¡A³oÓstatic_cast¥u¬O¹ï¨T¨®pB¤W¦¨DÃC¦â¡AÅܦ¨¤£§é¤£¦©¡AD¦âªº¨T¨®¦Ó¤v ¦pªG³o¼Ë¼g¤£¥i¥H¡A¨º½Ð±ÐC¤j¡A§ï¦¨¤U±ªº¼gªk¥i¤£¥i¥H? class B{B(B *pb){}}; class D:public B //D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û { D(pb *):B(pb){}; }; B *pB= new B; D* pD= new D(pB);//Âà´««Øºc¤l ¨S¿ù¡AB::B(B *pb){}´N¥sÂà´««Øºc¤l¡A¦bC++¼Ð·Ç¸Ì¬O©ñ¦bConversionªº³¹¸`¸Ì°Q½×¡C ¤£ª¾C¤j¹ï³oÂà´««Øºc¤l¬O§_«ù¤@¼Ë¬Ýªk:¤£¥i¥H¡A¤£¦XOOPªººë¯«? ¦pªGÂà´««Øºc¤l¥i¥H¡A³o¨âºØ³£¬OC++±`¥ÎªºÂà´«¤è¦¡¡A¼Òºc¤@¼Ë¡A³£¬OÂà´«3.ªº¥\¯à¡C ¥i¥HÂà´««Øºc¤l¥i¥H¡Astatic_cast«ç·|¤£¥i¥H?¦]¬°static_cast¬Ý°_°_¨Ó¤ñ¸û§N¡A©Ò¥H·P«_? ^^ ¨º§Ú§â«e±ªºCoordinate§ï¦¨Âà´««Øºc¤l¡A¬O§_§A´N¨S¦³·N¨£¤F? ´N§Ú¨Ó»¡¡AÅÞ¿è¡A¥\¯à§¹¥þ¤@¼Ë¡A¥u¬O´Â¤T¼Ç¥|¡A¤@¼Ëªº·N«ä¡C
Âà´«4. «e±´£¨ìªºÂà´««Øºc¤l¡A®³¨Ó°µÂà´«3.¦³ÂI¤û¤M±þ鷄¡A¤j§÷¤p¥Î¡C ¥Î¥¦°µÂà´«¡AÂà´«3.ªºl¥ÍÃþ§O¤v¸g¤£¨ü"«OÃÒ¤£¼W¥[¸ê®Æ¦¨û"¨î¤F¡C ¦]¬°Âà´«ª«¥ó¬Oì¥Í¦Ûl¥ÍÃþ§O¡C¦Ü©óÂà´«®É¡A¼W¥[ªº¸ê®Æ¦¨û¥i¥H¦b«Øºc¤l¸Ì³B²z¡C ·ÀI·íµM¤ñÂà´«3.°ª¡A¦ý´N¬O¨º¤@¥y¸Ü¡Aµ{¦¡û¦Ût·ÀI¡CC¤j¦pªG¬Ý¨ì³o¸Ìn¸õ¸}¡C½Ðµy¦w¤Å¾¸... ¤U±ªº«¬§OÂà´«¡A¥i¯à¤~¬OÃz¦åºÞ¯Åªº¡C:D
Âà´«5. ¥ý¬Ý¤@¤U³oÓ¨Ò¤l: char *str="I am CxxlMan" string ps= new string(str); ³o¬OC++¼Ð·Çµ{¦¡À]ªºÂà´««Øºc¤l¨Ò¤l¡C ¬O±qchar *«¬§OÂà´«¦¨ class string¡A§¹¥þ¨S¦å½tÃö«YªºÂà´«¡C ¦pªG»¡¡A¨º¬O¦]¬°³£¬O¦r¦ê®e¾¹ªºÃö«Y¡A©Ò¥H¤~¥iÂà´«¡C ¦n¹³¹ï¡A¨ä¹ê¤£¹ï¡C¹ï½s;¹¨Ó»¡¡A³o¬O§¹¥þ¤£¦Pªº¨âºØ§ÎºA¡C ¬O¤£¬O¦r¦ê®e¾¹¡A¥u¦³µ{¦¡ûª¾¹D¡AstringÂনchar *¡A¥i¤£¥i¥HÂà¡AÂà´«¦³¨S¦³·N¸q¡A¥u¦³µ{¦¡ûª¾¹D¡C ©Ò¥H...«áªG¦Ût¡C ¦pªG¦³¤H¤Ï»é¡A¨º¥u¬OÓ±a°Ñ¼Æªº«Øºc¤l¡A¤£¯àºâ¬O§Î§OÂà´«¡C ¦bC++¼Ð·Ç¤å¥ó¸Ì¡A³oºØ«Øºc¤l¬O©ñ¦btype conversionªº³¹¸`¸Ì¤¶²Ðªº¡C´N¹³½Æ»s«Øºc¤l¡A¤]¬O±a°Ñ¼Æªº«Øºc¤l¡C ¥¦Ì¦bC++ºÙ¤§¬°½Æ»s«Øºc¤l¡A©MÂà´««Øºc¤l¤@¼Ë³£¬O¯S©wªº«Øºc¤l¡C ¦ý,¦n§a... §Ú¤£ª§½×¡C¬Ý¤U±ªº¨Ï¥ÎªÌ©w¸qÂà´«¡C C++¹ï¶ì§Î¬O¥i¥H«¸üªº¡A¤]´N¬O»¡¡Aű§Î¾Þ§@n«ç»ò°µ¡A¨Ï¥ÎªÌ¥i¥H¦Ûq¸q(user define conversion)¡C ³o¤v¸g¶W¥X¶ì§Îªº½d³ò¡A¨Ï¥ÎªÌ¥i¥H¨Ï¥Î¶ì§Îªºoperator¡A¤Ñ°¨¦æªÅªºÂà´«§Î§Oª«¥ó¡C ¨Ò¦p MFC ªºCString(Ãþ¦üstring) CString s; char *= (char *)s;//¥Îcasting operatorÂà´«§¹¥þ¨S¦å½tÃö«Yªºª«¥ó ¦p¦ó«¸ücasting operator½Ð¦Û¦æ°Ñ¾\C++»y¨¥¡C ¨Ï¥ÎªÌ¦Û©w¸q¶ì§Î¡A´X¥G¥i¥H¤Ñ°¨¦æªÅ¡A·R«ç»òÂà´N«ç»òÂà¡A§¹¥þ¦Û¥Ñªº¡C ·íµM¡AÁÙ¬O«áªG¦Ût¡C
¬Ý¨ì³o¸Ì¡AÀ³¸Ó¥i¥H½T©wC++¹ïÂà´«¬O«Ü¶}©ñªº¤F§a(©Î³\§Oªºoop¨S³o»òfree)¡C ¦pªG¡A¦³¤Hn¦]¦¹§åµû¡AC++«Ü¤£OO¡A©ÎMFC«Ü¤£OO¡C ³o¬O¥t¥~ªºÄ³ÃD¡A¦ý´N¥»¼ÓijÃD¡A´N½ÍC++¡C(¤@½ÍOO´N·|©â¶HªºªF¦è¤@¤j°ï¶]¥X¨Ó¡A¼g¨ì·|©âµ¬¡A·Ð...)
|
|
|
2017/12/12 ¤U¤È 07:29:04
>>©Ò¥H§Ú¤~¥ÎÅÜ«¬©MÂ૬¨Ó°µ¤À³Î¡A¨º¬O¤£¦P»â°ì¡A¤£¦P·§©À¤U´£¨Ñ¤£¦Pªº¥\¯àµ¹§A°µ¿ï¾Ü¡A¤£¯à¤¬¬Û¨ú«Ý¡A§O·d²V¤F >¤@¤U³½¥Ø²V¯]¡A¤@¤U¤£¯à¤¬¬Û¨ú¥N¡C§Ú¨º¸Ì³½¥Ø²V¯]? >¤£¹L´NCoordinate¨ºÓµ{¦¡¡A§Ú»{¬°¥i¥H¥Îstatic_cast¹F¦¨¥Øªº¡A§A»{¬°¤£¯à³o¼Ë·d¡A¤£¬O¶Ü? >¦Ü©ó¤¬¬Û¨ú¥N¡A¤£ª¾¦ó©Ò«ü?
½Ð¥ý¦^ÀY¬Ý¡A¬O§An¥Î¨ÓÃÒ©ú dynamuc_cast ¤£¦w¥þ¡A §Ú¥u¬O»{¬°³oÃÒ©úµL®Ä
>¦pªG¤@Óupcast¡Aµ{¦¡û»{¬°¥Îdynamic_cast¤ñstatic_cast¥Nªº¦w¥þ©Ê¦n¡A¬°¦ó¤£¯à¨ú¥N? >¦pªG¦]¬°®Ä¯à¦Ò¶q¡Aµ{¦¡û»{¬°¥L¥i¥H¬°Âà§Ît³d¡Astatic_cast¨ú¥Ndynamic_cast¡A¤S¦³¦ó¤£¥i? >¦pªG¦bdynamic_cast³q¤£¹L¡A¦ýµ{¦¡û»{¬°Âà´«¨S¦³°ÝÃD¡A©Ò¥H¨Ï¥Îstatic_cast©Îreinterpret_cast¡A¬°¤°»ò¤£¦æ?(³oºØÂà´«¡A§An¥s¤°»ò§Ú¨S·N¨£) > >>·Q·Q oo ªº³Ì®Ú¥»ºë¯«¬O¤°»ò¡A·Q·Q°ª¶¥»y¨¥ªº¶D¨D¬O¤°»ò¡A¦A©M§A±Ä¥Îªº§Þ³N°µ¹ï·Ó >§ÚÌ«e±½Íªº¬OC++¡A¤£¬OOO(¤v¸g´£¥Ü¹L«Ü¦h¦¸)¡AC++¬O¨ÌOOP³W«h¦Ó¨Ó¡AOOPªº°ò·¡·íµM¬OOO¡C >±qÄ~©Ó°µ¤ñ³ë¡AOOPÄ~©Ó¦ÛOO¡AC++Ä~©Ó¦ÛOOP(¤£¾å±o³o·|¤£·|¤£Û¤£Ãþ¡A¦ýÀ³ª¾©Ò«ü) >n±qOO½Í°_¤]¥i¥H¡A³oÓ°Q½×¦ê¤j·§¥i¥Hªí¹F§Ú¹ïOOªºîzÂI: >http://www.programmer-club.com.tw/showSameTitleN/c/42739.html > >±qOO ªºÆ[ÂI¡AÃC¦â¥i¥H¬Oª«¥ó¡A¨T¨®¤]¬Oª«¥ó¡A¨ä¤l¶°¤]¥i¥Hª«¥ó¡A¨Ãµ²¦X¦¨¥tÃþª«¥ó¡C >©Ò¥H¬õ¦â(Ä~©Ó¦ÛÃC¦â)ªº¨T¨®(Ä~©Ó¦Û¨T¨®)¬Oª«¥ó¡AÂŦ⪺¨T¨®(Ä~©Ó¦Û¨T¨®)¤]¬Oª«¥ó¡C >Âà´«1.©Ò¥H¬õ¦âªº¨T¨®A¡A»¡¥¦¬O¨T¨®A(upcast)¡A·íµM¥i¥H¡C >Âà´«2.¨º¨T¨®A¡A»¡¥¦¬O¬õ¦âªº¨T¨®A(Downcast)¡A¥i¤£¥i¥H?¥i¥H¡A¦]¬°¨T¨®A쥻(ì¥Í)´N¬O¬õ¦âªº¨®¤l¡C >Âà´«3.¤@àw¨T¨®B(¨S¤WÃC¦â)¡A¥i¤£¥i¥H»¡¥¦¬O¬õ¦âªº¨T¨®A(Downcast)?°ò¥»¤W¤£¥i¥H¡C¦ýY¸g¤W¬õº£«á¡A´N¥i¥H¡C >Âà´«4.¨º¬õ¦âªº¨T¨®»¡¥¦¬OÂŦâ¨T¨®¡A¥i¤£¥i¥H?¦n¹³¤£¥i¥H§a¡I¦ý¸g«·s¯N¤W¬õº£«á¡A¥i¤£¥i¥H? >Âà´«5.¨º¬õ¦âªº¨T¨®»¡¥¦¬OÂŦ⪺¼¯¦«¨®¥i¤£¥i¥H?¤Ó§è¤F¡A¬O¤£¬O?¦ý¦pªG¬õ¦âªº¨T¨®¸g«·s§ï³y¦¨¨â½ü¾÷°Ê¨®©M¤W¬õº£©O? >·ÀI¶V©¹¤U¬O¶V°ª¡AOO¨S¦³»¡¨ºÓ¼h¯ÅªºÂà´«¤£¥i¥H¡COOÁ¿ªº¬Oµ²ºc¡Aì²z¡A¤£¬O½Í·ÀI¡C > >downcast¨Ó¬ÝC++ §a¡I >¦pªG¨Ì§Aªºª«¥ó§Î§OÂà´«Æ[ÂI¡A¥u¦³Âà´«1.©MÂà´«2.¤~¬O¦Xªk¥i¦æªº¡A¨ä¥¦³£¬O´c·d§a(¦pªG§Ú¨S»~·|§Aªº·N«ä)¡C >¦ýC++ÅãµM¤£¬O¨ÌC¤jªºÆ[ÂIq©wªº¡CC casting¦bC++¤À¦¨¥|ºØcasting¡C >castingªºÂ½Ä¶¡AÀ³Å±§Î©Î¶ì§Î¡A¦n¹³¥s¶ì§Î¤ñ¸û¦n(§Úı±o°Õ¡A¦ý¥Î¤°»ò§Ú¤£¤¶·N¡A¥H¤U¼È¥Î¶ì§Î)¡C >¦bC++³W½d¡Aª«¥ó§Î§OªºÂà´«ºÙ¤§¬°type conversion(¨£Standard for Programming Language C++)¤£¬O¥u¦³¶ì§Î¦Ó¤v¡A >¨ä°ò¥»ºë¯«¡Aª«¥ó§Î§O¥i¤£¥i¥HÂà´«¡Aµ{¦¡û¦³¥D±±Åv¡A¨Ã¤£¨üÂà´«1.©MÂà´«2.¡C >¨Æ¹ê¤W±qÂà´«1.¨ìÂà´«5.³£¬OC++¤¹³\ªº½d³ò¡C¶V©¹¤UªºÂà´«¡A·ÀI¶V°ª¡AÂà´«ªº·ÀI´N¬Oµ{¦¡û¦Ût¡C > >Âà´«1. >´X¥G½T©w¨S¤°»ò°ÝÃD¡A©Ò¥H¥i¥HÁô¦¡Âà´«( µ{¦¡û¤£¥ÎÁn©ú¡A¦Û°ÊÂà´«)¡A¨Ò¦p: >class B{}; >class D:public B{}; >B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´« > >Âà´«2. >µy¨ã·ÀI¡A©Ò¥H»ÝnÁn©úÂà´«(Åý½s;¹½T©w³o¬Oµ{¦¡ûªº¥»·N)¡AÁn©úªº¤èªk´N¬Ostatic_cast >class B{}; >class D:public B{}; >B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´« >D* pD= static_cast<D *>pB;//¦]¬°¬Odowncast¡Aµy¨ã·ÀI¡A©Ò¥Hnstatic_castÁn©ú >¦bC++¸Ì¡Aª«¥ó¸ÌY¦³type information¡Aª«¥ó§Î§O¤]¥i¥H°ÊºAÀˬd¬O§_ÄÝ©óÂà´«1.Âà´«2. >class B{}; >class D:public B{}; >B *pB= new D;//¤£¥ÎÁn©ú¡A´N¥i¥HÂà´« >D* pD= dynamic_cast<D *>pB;// dynamic_castªº¦¨¥\¡A(¬Û¹ï¨Ó»¡)«OÃÒ¤FÂà´«¬O¦bÂà´«1.Âà´«2.ªº¬Û¹ï¦w¥þ½d³ò¤º¡C > >Âà´«3. >´N¬O¥»°Q½×¦ê©MC¤jª§Ä³³Ì¤[ªº¨Ò¤l¡A¨ä¹ê¥¦¤ñÂà´«4.©MÂà´«5.¬Û¹ï¦w¥þ«Ü¦h¡A¯uªº¤£ª¾¹D¬°¤°»ò¥i¥Hª§½×¨º»ò¦h½g´T¡C >class B{}; >class D:public B{};//D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û >B *pB= new B; >D* pD= static_cast<D *>pB;//¦]¬°D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û¡A³oÓstatic_cast¥u¬O¹ï¨T¨®pB¤W¦¨DÃC¦â¡AÅܦ¨¤£§é¤£¦©¡AD¦âªº¨T¨®¦Ó¤v >¦pªG³o¼Ë¼g¤£¥i¥H¡A¨º½Ð±ÐC¤j¡A§ï¦¨¤U±ªº¼gªk¥i¤£¥i¥H? >class B{B(B *pb){}}; >class D:public B //D«OÃÒ¤£¼W¥[¸ê®Æ¦¨û >{ >D(pb *):B(pb){}; >}; >B *pB= new B; >D* pD= new D(pB);//Âà´««Øºc¤l >¨S¿ù¡AB::B(B *pb){}´N¥sÂà´««Øºc¤l¡A¦bC++¼Ð·Ç¸Ì¬O©ñ¦bConversionªº³¹¸`¸Ì°Q½×¡C >¤£ª¾C¤j¹ï³oÂà´««Øºc¤l¬O§_«ù¤@¼Ë¬Ýªk:¤£¥i¥H¡A¤£¦XOOPªººë¯«? >¦pªGÂà´««Øºc¤l¥i¥H¡A³o¨âºØ³£¬OC++±`¥ÎªºÂà´«¤è¦¡¡A¼Òºc¤@¼Ë¡A³£¬OÂà´«3.ªº¥\¯à¡C >¥i¥HÂà´««Øºc¤l¥i¥H¡Astatic_cast«ç·|¤£¥i¥H?¦]¬°static_cast¬Ý°_°_¨Ó¤ñ¸û§N¡A©Ò¥H·P«_? ^^ >¨º§Ú§â«e±ªºCoordinate§ï¦¨Âà´««Øºc¤l¡A¬O§_§A´N¨S¦³·N¨£¤F? >´N§Ú¨Ó»¡¡AÅÞ¿è¡A¥\¯à§¹¥þ¤@¼Ë¡A¥u¬O´Â¤T¼Ç¥|¡A¤@¼Ëªº·N«ä¡C > >Âà´«4. >«e±´£¨ìªºÂà´««Øºc¤l¡A®³¨Ó°µÂà´«3.¦³ÂI¤û¤M±þ鷄¡A¤j§÷¤p¥Î¡C >¥Î¥¦°µÂà´«¡AÂà´«3.ªºl¥ÍÃþ§O¤v¸g¤£¨ü'«OÃÒ¤£¼W¥[¸ê®Æ¦¨û'¨î¤F¡C >¦]¬°Âà´«ª«¥ó¬Oì¥Í¦Ûl¥ÍÃþ§O¡C¦Ü©óÂà´«®É¡A¼W¥[ªº¸ê®Æ¦¨û¥i¥H¦b«Øºc¤l¸Ì³B²z¡C >·ÀI·íµM¤ñÂà´«3.°ª¡A¦ý´N¬O¨º¤@¥y¸Ü¡Aµ{¦¡û¦Ût·ÀI¡CC¤j¦pªG¬Ý¨ì³o¸Ìn¸õ¸}¡C½Ðµy¦w¤Å¾¸... >¤U±ªº«¬§OÂà´«¡A¥i¯à¤~¬OÃz¦åºÞ¯Åªº¡C:D > >Âà´«5. >¥ý¬Ý¤@¤U³oÓ¨Ò¤l: >char *str='I am CxxlMan' >string ps= new string(str); >³o¬OC++¼Ð·Çµ{¦¡À]ªºÂà´««Øºc¤l¨Ò¤l¡C >¬O±qchar *«¬§OÂà´«¦¨ class string¡A§¹¥þ¨S¦å½tÃö«YªºÂà´«¡C >¦pªG»¡¡A¨º¬O¦]¬°³£¬O¦r¦ê®e¾¹ªºÃö«Y¡A©Ò¥H¤~¥iÂà´«¡C >¦n¹³¹ï¡A¨ä¹ê¤£¹ï¡C¹ï½s;¹¨Ó»¡¡A³o¬O§¹¥þ¤£¦Pªº¨âºØ§ÎºA¡C >¬O¤£¬O¦r¦ê®e¾¹¡A¥u¦³µ{¦¡ûª¾¹D¡AstringÂনchar *¡A¥i¤£¥i¥HÂà¡AÂà´«¦³¨S¦³·N¸q¡A¥u¦³µ{¦¡ûª¾¹D¡C >©Ò¥H...«áªG¦Ût¡C >¦pªG¦³¤H¤Ï»é¡A¨º¥u¬OÓ±a°Ñ¼Æªº«Øºc¤l¡A¤£¯àºâ¬O§Î§OÂà´«¡C >¦bC++¼Ð·Ç¤å¥ó¸Ì¡A³oºØ«Øºc¤l¬O©ñ¦btype conversionªº³¹¸`¸Ì¤¶²Ðªº¡C´N¹³½Æ»s«Øºc¤l¡A¤]¬O±a°Ñ¼Æªº«Øºc¤l¡C >¥¦Ì¦bC++ºÙ¤§¬°½Æ»s«Øºc¤l¡A©MÂà´««Øºc¤l¤@¼Ë³£¬O¯S©wªº«Øºc¤l¡C >¦ý,¦n§a... §Ú¤£ª§½×¡C¬Ý¤U±ªº¨Ï¥ÎªÌ©w¸qÂà´«¡C >C++¹ï¶ì§Î¬O¥i¥H«¸üªº¡A¤]´N¬O»¡¡Aű§Î¾Þ§@n«ç»ò°µ¡A¨Ï¥ÎªÌ¥i¥H¦Ûq¸q(user define conversion)¡C >³o¤v¸g¶W¥X¶ì§Îªº½d³ò¡A¨Ï¥ÎªÌ¥i¥H¨Ï¥Î¶ì§Îªºoperator¡A¤Ñ°¨¦æªÅªºÂà´«§Î§Oª«¥ó¡C >¨Ò¦p >MFC ªºCString(Ãþ¦üstring) >CString s; >char *= (char *)s;//¥Îcasting operatorÂà´«§¹¥þ¨S¦å½tÃö«Yªºª«¥ó >¦p¦ó«¸ücasting operator½Ð¦Û¦æ°Ñ¾\C++»y¨¥¡C >¨Ï¥ÎªÌ¦Û©w¸q¶ì§Î¡A´X¥G¥i¥H¤Ñ°¨¦æªÅ¡A·R«ç»òÂà´N«ç»òÂà¡A§¹¥þ¦Û¥Ñªº¡C >·íµM¡AÁÙ¬O«áªG¦Ût¡C > >¬Ý¨ì³o¸Ì¡AÀ³¸Ó¥i¥H½T©wC++¹ïÂà´«¬O«Ü¶}©ñªº¤F§a(©Î³\§Oªºoop¨S³o»òfree)¡C >¦pªG¡A¦³¤Hn¦]¦¹§åµû¡AC++«Ü¤£OO¡A©ÎMFC«Ü¤£OO¡C >³o¬O¥t¥~ªºÄ³ÃD¡A¦ý´N¥»¼ÓijÃD¡A´N½ÍC++¡C(¤@½ÍOO´N·|©â¶HªºªF¦è¤@¤j°ï¶]¥X¨Ó¡A¼g¨ì·|©âµ¬¡A·Ð...) >
¦nªø¤@¬q¡A¥Î¤â¾÷¬Ý¦³ÂIµhW¡A©Ò¥H¨S¬Ý§¹¡A¥H§Aªº¤ô¥À³¸Ó¤£·|¦³¿ù¡A¥un¤£¥Î¿ù¦a¤è
|
|
|
2017/12/12 ¤U¤È 09:45:37
>½Ð¥ý¦^ÀY¬Ý¡A¬O§An¥Î¨ÓÃÒ©ú dynamuc_cast ¤£¦w¥þ¡A >§Ú¥u¬O»{¬°³oÃÒ©úµL®Ä µð¡I¡H¨º¸Ì? §A¤£¬O¤@ª½°í«ù¡Adynamic_cast³q¤£¹L´N¤£¯à¥Îstatic_cast¨ú¥N¡A¥Îstatic_cast´N¬O¶Ã·d¶Ü? ¤°»ò®ÉÔÅܦ¨§Ú»¡dynamic_cast¤£¦w¥þ?§Ú»¡ªº¬O:dynamic_cast ¥i¥H³q¹Lªí¥Ü( ¬Û¹ï¨Ó»¡)¬O¦w¥þªº¡A¦ý¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C
>¦nªø¤@¬q¡A¥Î¤â¾÷¬Ý¦³ÂIµhW¡A©Ò¥H¨S¬Ý§¹¡A¥H§Aªº¤ô¥À³¸Ó¤£·|¦³¿ù¡A¥un¤£¥Î¿ù¦a¤è STD lib©MMFCªº¨Ò¤l¡A¦pªG¦³¿ù¡A¤£n§ä§Ú:D
|
|
|
2017/12/13 ¤U¤È 12:23:44
>>½Ð¥ý¦^ÀY¬Ý¡A¬O§An¥Î¨ÓÃÒ©ú dynamuc_cast ¤£¦w¥þ¡A >>§Ú¥u¬O»{¬°³oÃÒ©úµL®Ä >µð¡I¡H¨º¸Ì? >§A¤£¬O¤@ª½°í«ù¡Adynamic_cast³q¤£¹L´N¤£¯à¥Îstatic_cast¨ú¥N¡A¥Îstatic_cast´N¬O¶Ã·d¶Ü?
¥¿¸Ñ
>¤°»ò®ÉÔÅܦ¨§Ú»¡dynamic_cast¤£¦w¥þ? >
§A¸ÑÄÀ¥H¤U§a
>2017/11/27 ¤U¤È 10:27:01 >¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M >if (dynamic_cast<Derived4*>(clone_pBase4)) >¡@cout << '¦w¥þÂ૬' << endl; >else >¡@cout << '¤£¦w¥þÂ૬' << endl; > >ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' >©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C >¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C
>§Ú»¡ªº¬O:dynamic_cast ¥i¥H³q¹Lªí¥Ü( ¬Û¹ï¨Ó»¡)¬O¦w¥þªº¡A¦ý¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C
RTTI ·§©À«Ü𥶆³æ¤]«Ü½T¹ê¡A¦³´N¬O¦³¡A¨S¦³´N¬O¨S¦³¡A¹ï´N¬O¹ï¡A¿ù´N¬O¿ù ¤£³q¹L´N¬O¨S¦³¡A¤£³q¹L´N¬O¿ù¡A¤£¯à¥Î static_cast ¨ÓÃÒ©ú "¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù"
¬°¤°»ò§A§Ú»{ª¾·|¦³®t²§¡A¦]𠉎¨S²z¸Ñ oo «µøªº¬O type¡A¤£¬O¤º®e¡A ¦Ó§A¤@ª½§â¤º®e¤@¼Ëªº class µø¬°¥i¤¬Â઺
|
|
|
2017/12/13 ¤U¤È 01:43:13
C>§A¸ÑÄÀ¥H¤U§a S>>2017/11/27 ¤U¤È 10:27:01 S>>¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M S>>if (dynamic_cast<Derived4*>(clone_pBase4)) S>>¡@cout << '¦w¥þÂ૬' << endl; S>>else S>>¡@cout << '¤£¦w¥þÂ૬' << endl; S>> S>>ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' S>>©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C S>>¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C n¸ÑÄÀ¤°»ò?³o¬q¸Ü¦p¦ó¯à²z¸Ñ¦¨§Ú¥Î¨Ó"ÃÒ©ú dynamuc_cast ¤£¦w¥þ"? ¥u¬O»¡©ú¤£¦w¥þ¤£ªí¥Ü¿ùªº¡A¥u¬Orttiªº¾÷¨îµLªk½T»{¦w¥þ¡C ³o©M§Ú³o¥y¸Ü¦³¤°»ò¤£¦P? S>>§Ú»¡ªº¬O:dynamic_cast ¥i¥H³q¹Lªí¥Ü( ¬Û¹ï¨Ó»¡)¬O¦w¥þªº¡A¦ý¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C µ{¦¡ûn°í«ùÂ૬¡A´N¬O¾a¦Û¤v§PÂ_¡CC++µ{¦¡¦w¤£¦w¥þ¹J¥DnÁÙ¬On¾a¦Û¤v¡A¤£n¥þ¿àµ¹½s;¹¡C³o¤~¬OC++ºë¯«¡C
>RTTI ·§©À«Ü𥶆³æ¤]«Ü½T¹ê¡A¦³´N¬O¦³¡A¨S¦³´N¬O¨S¦³¡A¹ï´N¬O¹ï¡A¿ù´N¬O¿ù ¤å¥óÁ¿ªº¬O"¤£¦w¥þ"ÁÙ¬O"¿ù"?¨âÓªº®t²§¡A§A¤F¸Ñ¶Ü? ¦pªG·Ó§A³o»ò¸ÑÄÀ¡A2017/12/12 ¤U¤È 05:23:19§Ú¶KªºÂà´«3.~Âà´«5.³£¤£¥i¯à¦b dynamuc_cast ³q¹L¡C std lib©MMFC class³£¦³«Ü¦h¨Ò¤l¡A§A»{¬°¥¦Ì³£¬O¶Ã·d?
>¤£³q¹L´N¬O¨S¦³¡A¤£³q¹L´N¬O¿ù¡A¤£¯à¥Î static_cast ¨ÓÃÒ©ú "¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù" ÁÙ¬OJ¶Ã¸ÑÄÀ§Úªº¸Ü¤F¡I§Ú»¡ªº¬O¨Ï¥Îstatic_castÂ૬¡A¹ï¿ù¥Ñµ{¦¡û¦Û¤vt³d¡A¨S¦³nÃÒ©údynamuc_cast¤°»ò¡C ¦Ü©ódynamuc_cast¤£³q¹L´Nªí¥Ü½s͵Lªk½T»{Â૬¬O¦w¥þ¦Ó¤v¡A¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C³o¬O¹ï¦w¤£¦w¥þªº¸ÑÄÀ¡A¤zstatic_cast¦ó¨Æ?
>¬°¤°»ò§A§Ú»{ª¾·|¦³®t²§¡A¦]𠉎¨S²z¸Ñ oo «µøªº¬O type¡A¤£¬O¤º®e¡A type¬OOOPªºªF¦è¡A¤£¬OOO(´£¥Ü«Ü¦h¦¸)¡COO¥u½Íª«¥ó(´Nºâ´£¨ìtype³oÓ¦r¤]¥u¬O·íª«¥ó¦b³B²z)¡AOOP ¸Ìªºtype¦bOO¸Ì¬Oª«¥ó¡A¦ý¦bOOP¸Ì°ò¥»¤W¤£§âtypeµø¬°ª«¥ó¡C
>¦Ó§A¤@ª½§â¤º®e¤@¼Ëªº class µø¬°¥i¤¬Âà ¤£¥u¬O¤º®e¤@¼Ëªº class¤¬Âà¡C ¥unµ{¦¡û»{¥iªº¡A³£¥i¥HÂà(C++´£¨Ñ³Ì¤jªº¦Û¥Ñ«×Åýµ{û¥i¥HÂà´«)¡C¹ï¿ù´N¬Oµ{¦¡ût³d¡C ³o¤~¬OC++ªººë¯«¡C
nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡? ¤£n¸I¨ì«ÂI´N¬n¨ì§OªºÄ³ÃD¡A¤×¨ä¬O®³§á¦±§O¤Hªº¸Ü¨Óª§½×¡C ¦pªG¡A¥u¬O³o¼Ë¡AµL»Ý¦A°Q½×¤U¥h¡C§Ú¤£¬O¨Ó§n¬[ªº¡C
|
|
|
2017/12/13 ¤U¤È 03:16:45
¦n§a¡A§ï¨ì§Aº¡·N
>>½Ð¥ý¦^ÀY¬Ý¡A¬O§An¥Î¨ÓÃÒ©ú dynamuc_cast ¤£¦w¥þ¡A >>§Ú¥u¬O»{¬°³oÃÒ©úµL®Ä >µð¡I¡H¨º¸Ì? >§A¤£¬O¤@ª½°í«ù¡Adynamic_cast³q¤£¹L´N¤£¯à¥Îstatic_cast¨ú¥N¡A¥Îstatic_cast´N¬O¶Ã·d¶Ü?
¥¿¸Ñ
>¤°»ò®ÉÔÅܦ¨§Ú»¡dynamic_cast¤£¦w¥þ? >
§Aµ´¹ï¦³»¡¡A¤Þµ¹§A¬Ý
>2017/11/27 ¤U¤È 10:27:01 >¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M >if (dynamic_cast<Derived4*>(clone_pBase4)) >¡@cout << '¦w¥þÂ૬' << endl; >else >¡@cout << '¤£¦w¥þÂ૬' << endl; > >ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' >©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C >¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C
>§Ú»¡ªº¬O:dynamic_cast ¥i¥H³q¹Lªí¥Ü( ¬Û¹ï¨Ó»¡)¬O¦w¥þªº¡A¦ý¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C
RTTI ·§©À«Ü𥶆³æ¤]«Ü½T¹ê¡A¦³´N¬O¦³¡A¨S¦³´N¬O¨S¦³¡A¹ï´N¬O¹ï¡A¿ù´N¬O¿ù ¤£³q¹L´N¬O¨S¦³¡A¤£³q¹L´N¬O¿ù¡A¤£¯à¥Î static_cast ¨ÓÃÒ©ú "¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù"
¬°¤°»ò§A§Ú»{ª¾·|¦³®t²§¡A¦]𠉎¨S²z¸Ñ oop «µøªº¬O type¡A¤£¬O¤º®e¡A ¦Ó§A¤@ª½§â¤º®e¤@¼Ëªº class µø¬°¥i¤¬Â઺
|
|
|
2017/12/13 ¤U¤È 03:26:23
>>RTTI ·§©À«Ü𥶆³æ¤]«Ü½T¹ê¡A¦³´N¬O¦³¡A¨S¦³´N¬O¨S¦³¡A¹ï´N¬O¹ï¡A¿ù´N¬O¿ù >¤å¥óÁ¿ªº¬O'¤£¦w¥þ'ÁÙ¬O'¿ù'?¨âÓªº®t²§¡A§A¤F¸Ñ¶Ü? >¦pªG·Ó§A³o»ò¸ÑÄÀ¡A2017/12/12 ¤U¤È 05:23:19§Ú¶KªºÂà´«3.~Âà´«5.³£¤£¥i¯à¦b dynamuc_cast ³q¹L¡C >std lib©MMFC class³£¦³«Ü¦h¨Ò¤l¡A§A»{¬°¥¦Ì³£¬O¶Ã·d?
¨ºÃö dynamuc_cast ¤°»ò¨Æ
> >>¤£³q¹L´N¬O¨S¦³¡A¤£³q¹L´N¬O¿ù¡A¤£¯à¥Î static_cast ¨ÓÃÒ©ú '¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù' >ÁÙ¬OJ¶Ã¸ÑÄÀ§Úªº¸Ü¤F¡I§Ú»¡ªº¬O¨Ï¥Îstatic_castÂ૬¡A¹ï¿ù¥Ñµ{¦¡û¦Û¤vt³d¡A¨S¦³nÃÒ©údynamuc_cast¤°»ò¡C >¦Ü©ódynamuc_cast¤£³q¹L´Nªí¥Ü½s͵Lªk½T»{Â૬¬O¦w¥þ¦Ó¤v¡A¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C³o¬O¹ï¦w¤£¦w¥þªº¸ÑÄÀ¡A¤zstatic_cast¦ó¨Æ?
dynamuc_cast ¤£³q¹Lªí¥Üª«¥ó§t¨ä¦¨¥÷¡A¤£Ãö static_cast ªº¨Æ
> >>¬°¤°»ò§A§Ú»{ª¾·|¦³®t²§¡A¦]𠉎¨S²z¸Ñ oo «µøªº¬O type¡A¤£¬O¤º®e¡A >type¬OOOPªºªF¦è¡A¤£¬OOO(´£¥Ü«Ü¦h¦¸)¡COO¥u½Íª«¥ó(´Nºâ´£¨ìtype³oÓ¦r¤]¥u¬O·íª«¥ó¦b³B²z)¡AOOP ¸Ìªºtype¦bOO¸Ì¬Oª«¥ó¡A¦ý¦bOOP¸Ì°ò¥»¤W¤£§âtypeµø¬°ª«¥ó¡C
¤w¶¶§A·N¤F
> >>¦Ó§A¤@ª½§â¤º®e¤@¼Ëªº class µø¬°¥i¤¬Âà >¤£¥u¬O¤º®e¤@¼Ëªº class¤¬Âà¡C >¥unµ{¦¡û»{¥iªº¡A³£¥i¥HÂà(C++´£¨Ñ³Ì¤jªº¦Û¥Ñ«×Åýµ{û¥i¥HÂà´«)¡C¹ï¿ù´N¬Oµ{¦¡ût³d¡C >³o¤~¬OC++ªººë¯«¡C
¨º¬O C ªºÙί«¡A§A¤@©w·|»¡ CPP §A¯à³o¼Ë°µ¡A©Ò¥H§Ú¤~¥Î oo ¦Ó¤£¥Î oop
> >nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 >¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡? >¤£n¸I¨ì«ÂI´N¬n¨ì§OªºÄ³ÃD¡A¤×¨ä¬O®³§á¦±§O¤Hªº¸Ü¨Óª§½×¡C >¦pªG¡A¥u¬O³o¼Ë¡AµL»Ý¦A°Q½×¤U¥h¡C§Ú¤£¬O¨Ó§n¬[ªº¡C
¨º®Ú¥»¤£Ãö dynamuc_cast ªº¨Æ¡Adynamuc_cast ·F¹À¥hºÞ³q°Tªº¨Æ±¡
|
|
|
2017/12/13 ¤U¤È 03:28:20
>> >>>¤£³q¹L´N¬O¨S¦³¡A¤£³q¹L´N¬O¿ù¡A¤£¯à¥Î static_cast ¨ÓÃÒ©ú '¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù' >>ÁÙ¬OJ¶Ã¸ÑÄÀ§Úªº¸Ü¤F¡I§Ú»¡ªº¬O¨Ï¥Îstatic_castÂ૬¡A¹ï¿ù¥Ñµ{¦¡û¦Û¤vt³d¡A¨S¦³nÃÒ©údynamuc_cast¤°»ò¡C >>¦Ü©ódynamuc_cast¤£³q¹L´Nªí¥Ü½s͵Lªk½T»{Â૬¬O¦w¥þ¦Ó¤v¡A¤£ªí¥Ü¤£³q¹L´N¬O¦³¿ù¡C³o¬O¹ï¦w¤£¦w¥þªº¸ÑÄÀ¡A¤zstatic_cast¦ó¨Æ? > >dynamuc_cast ¤£³q¹Lªí¥Üª«¥ó§t¨ä¦¨¥÷¡A¤£Ãö static_cast ªº¨Æ >
³o¸Ì¤Ö¥´¤@Ó¦r
dynamuc_cast ¤£³q¹Lªí¥Üª«¥ó¤£§t¨ä¦¨¥÷¡A¤£Ãö static_cast ªº¨Æ
|
|
|
2017/12/13 ¤U¤È 03:36:13
> >> >>>¦Ó§A¤@ª½§â¤º®e¤@¼Ëªº class µø¬°¥i¤¬Âà >>¤£¥u¬O¤º®e¤@¼Ëªº class¤¬Âà¡C >>¥unµ{¦¡û»{¥iªº¡A³£¥i¥HÂà(C++´£¨Ñ³Ì¤jªº¦Û¥Ñ«×Åýµ{û¥i¥HÂà´«)¡C¹ï¿ù´N¬Oµ{¦¡ût³d¡C >>³o¤~¬OC++ªººë¯«¡C > >¨º¬O C ªºÙί«¡A§A¤@©w·|»¡ CPP §A¯à³o¼Ë°µ¡A©Ò¥H§Ú¤~¥Î oo ¦Ó¤£¥Î oop
¨º¬O C ªºÙί«¡A§A¤@©w·|»¡ CPP ¤]¯à³o¼Ë°µ¡A©Ò¥H§Ú¤~¥Î oo ¦Ó¤£¥Î oop
|
|
|
2017/12/13 ¤U¤È 03:39:42
S>¤°»ò®ÉÔÅܦ¨§Ú»¡dynamic_cast¤£¦w¥þ? C>§Aµ´¹ï¦³»¡¡A¤Þµ¹§A¬Ý
>2017/11/27 ¤U¤È 10:27:01 S>¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M S>if (dynamic_cast<Derived4*>(clone_pBase4)) S>¡@cout << '¦w¥þÂ૬' << endl; S>else S>¡@cout << '¤£¦w¥þÂ૬' << endl; S> S>ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' S>©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C S>¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C ÁÙ¬O¬Ý¤£¥X§Ú¦³»¡"dynamic_cast¤£¦w¥þ"¡C ¥æ³q³¡(dynamic_cast)»¡°¨¸ô¦pªê¤f (¤£¦w¥þÂ૬¡A¦]¬°¤£½T©w¥i¥HÂà)¡C¨Ã¤£¬O»¡¦æ¤H¤£¯à¤W°¨¸ô(¤£¬O¤£¯àÂà)¡C¦æ¤H¤W°¨¸ô´N¬O¦Û¨¦w¥þ¦Û¤vÅU(nÂà´N¦Ût¦w¥þ)¡C ²×¨s§An§â '¤£¦w¥þÂ૬'µ¥¦P©ó"¿ùªº" ±À¦V¤@©w¤£¯àÂ૬¡Aµø¬°©w«ß¡A¨º§Ú¨S¿ìªk¡A¦ý¤£n¤@ª½§á¦±§O¤Hªº·N«ä¡C ¤£n¦A¬n¨ìµL¿×ªº¤å·N¤§ª§§a¡C «ÂI¦A¶K¤@¦¸: nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
|
|
|
2017/12/13 ¤U¤È 03:59:31
>S>¤°»ò®ÉÔÅܦ¨§Ú»¡dynamic_cast¤£¦w¥þ? >C>§Aµ´¹ï¦³»¡¡A¤Þµ¹§A¬Ý > >>2017/11/27 ¤U¤È 10:27:01 >S>¦n§a¡A§Ú§ï¼g¤@¤Uµ{¦¡¡A©Î³\¸û¯à¼á²M >S>if (dynamic_cast<Derived4*>(clone_pBase4)) >S>¡@cout << '¦w¥þÂ૬' << endl; >S>else >S>¡@cout << '¤£¦w¥þÂ૬' << endl; >S> >S>ª`·N: '(¤£)¦w¥þ' ¤£¬O '(¤£)§¹¥þ' >S>©Ò¿×'¤£¦w¥þ'¥u¬O¨S¿ìªk«OÃÒ¦w¥þ¡A¨Ã¤£¬O»¡Â૬¤@©w¬O¿ùªº¡C >S>¦pªGµ{¦¡û½T©wÂ૬¬O¹ïªº¡A¥i¥H¥Îstatic_cast¨Ó±j¨îÂ૬¡C >ÁÙ¬O¬Ý¤£¥X§Ú¦³»¡'dynamic_cast¤£¦w¥þ'¡C >¥æ³q³¡(dynamic_cast)»¡°¨¸ô¦pªê¤f (¤£¦w¥þÂ૬¡A¦]¬°¤£½T©w¥i¥HÂà)¡C¨Ã¤£¬O»¡¦æ¤H¤£¯à¤W°¨¸ô(¤£¬O¤£¯àÂà)¡C¦æ¤H¤W°¨¸ô´N¬O¦Û¨¦w¥þ¦Û¤vÅU(nÂà´N¦Ût¦w¥þ)¡C >²×¨s§An§â '¤£¦w¥þÂ૬'µ¥¦P©ó'¿ùªº' ±À¦V¤@©w¤£¯àÂ૬¡Aµø¬°©w«ß¡A¨º§Ú¨S¿ìªk¡A¦ý¤£n¤@ª½§á¦±§O¤Hªº·N«ä¡C >¤£n¦A¬n¨ìµL¿×ªº¤å·N¤§ª§§a¡C >«ÂI¦A¶K¤@¦¸: >nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 >¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
dynamic_cast ¤£¯à³q¹L¬O dynamic_cast ªº¨Æ¡A static_cast ¥i¥H³q¹L¬O static_cast ªº¨Æ¡A¤£¯à¦] static_cast ¥i¥H³q¹L´N»¡ dynamic_cast ¤£¯à³q¹L¬O"¤£¦w¥þ" ¡Adynamic_cast ¤£¯à³q¹L´N¬O¤£¯à³q¹L¡A¨S¦³¥i½èºÃªº
|
|
|
2017/12/13 ¤U¤È 05:38:51
>dynamic_cast ¤£¯à³q¹L¬O dynamic_cast ªº¨Æ¡A static_cast ¥i¥H³q¹L¬O static_cast ªº¨Æ¡A ¥¿½T¡I¤£¬O¤@ª½¸ò§A»¡dynamic_cast ¤£³q¹L¬O¥¦ªº¨Æ¡A¤£¯à¦]¬°dynamic_cast ¤£³q¹L´N»¡static_cast ¤]¤£¯à¥Î¶Ü?
>¤£¯à¦] static_cast ¥i¥H³q¹L´N»¡ dynamic_cast ¤£¯à³q¹L¬O"¤£¦w¥þ" ¡A ±q¨Ó¨S¦³³oºØ»¡ªk¡I¦pªG¤£¯à¥¿½T¸ÑŪ§O¤Hªº·N«ä¡A´Nª½±µ¤Þ¤å´N¦n¡A¤£n¶Ã¸àÄÀ¡C ©Ò¿×"¤£¦w¥þ"¬O´Ndynamic_castªºÀˬd±ø¥ó¡A»{¬°¤£¦w¥þ(¥¼¥²¬O¤£¯àÂà)¡A³o¤zstatic_cast ¦ó¨Æ? ¦P¼Ëªº¡Aµ{¦¡û»{¬°¥i¥H¦Ûtµ{¦¡¹ï¿ù¡A¨Ï¥Îstatic_cast¤S¤zdynamic_cast¦ó¨Æ?
nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
¨º¨â½g¶K¤å§Úªá¤F¨Ç®É¶¡¼gªº¡A¥Øªº¬On°Q½×°ÝÃD¥»½è¡A¤£¬On§A¤@ª½¦±¸Ñ¤å¦r¡AµM«á§Ú©é©R¦b¼á²M¡C©Ò¥H nÄ~Äò°Q½×¡A½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
|
|
|
2017/12/13 ¤U¤È 06:27:34
>>¤£¯à¦] static_cast ¥i¥H³q¹L´N»¡ dynamic_cast ¤£¯à³q¹L¬O'¤£¦w¥þ' ¡A >±q¨Ó¨S¦³³oºØ»¡ªk¡I¦pªG¤£¯à¥¿½T¸ÑŪ§O¤Hªº·N«ä¡A´Nª½±µ¤Þ¤å´N¦n¡A¤£n¶Ã¸àÄÀ¡C >©Ò¿×'¤£¦w¥þ'¬O´Ndynamic_castªºÀˬd±ø¥ó¡A»{¬°¤£¦w¥þ(¥¼¥²¬O¤£¯àÂà)¡A³o¤zstatic_cast ¦ó¨Æ? >¦P¼Ëªº¡Aµ{¦¡û»{¬°¥i¥H¦Ûtµ{¦¡¹ï¿ù¡A¨Ï¥Îstatic_cast¤S¤zdynamic_cast¦ó¨Æ?
§A¬O»¡ clone() ±o¨ìªº¤À¨¡Adynamic_cast Àˬd¤£¦X®æ¡A¥un¤º®e¤£ÅÜ´N¥i¥H¥Î static_cast ±j»sÂ૬??? §Ú¥uÅ¥»¡ typeid Àˬd³q¹L¡A¤~¯à¥Î static_cast Â૬
¤º®e¤@¼Ë¥i¥H¥Î static_cast ¬O C ªº·§©À¡A¤£¯à¥Î¦b C++
|
|
|
2017/12/13 ¤U¤È 07:08:18
>§Ú¥uÅ¥»¡ typeid Àˬd³q¹L¡A¤~¯à¥Î static_cast Â૬ ¨º¸ÌÅ¥»¡ªº? ¯à¤£¯àÂ૬¡Aµ{¦¡û¤~¦³¥D±±Åv¡C«ç»òÂà¡AC++´£¨Ñ¤Ó¦hºÞ¹D©M¤è¦¡(©Î»yªk)¡C ¦Ü©óÂà¤F¡Aµo¥Í¤°»ò¨Æ¡A¨º¬Oµ{¦¡ûªº³d¥ô¡C
>¤º®e¤@¼Ë¥i¥H¥Î static_cast ¬O C ªº·§©À¡A¤£¯à¥Î¦b C++ static_cast¬OC++¤~¦³ªº¡A¥Øªº¤]¤£¬O¬°¤F©MC¬Û®e(C++«O¯dC 쥻ªºcasting operator¤~¬O¬°¤F¬Û®e) static_cast¬O¦³Ãþ§OÄ~©Ó(¦å½tÃö«Y)Àˬdªº¡A³o¤]¬OC¨S¦³ªº¡C ¤@¼Ëªºª«¥ó¥i¥H¦b¤£¦Pªº¾Þ§@Ãþ§OÂà´«¡A¬Oµ{¦¡û»{¬°¨S°ÝÃD«á¥hÂà´«ªº(¦Ût³d¥ô)¡C¤£¬O¤å¥ó³o»ò»¡¡C ¦Ü©ó«ç»òÂà(¥ÎC++´£¨Ñªº¨º¤@ºØÂà´«¤è¦¡)¡A¨º¤]¬Oµ{¦¡ûªº¿ï¾Ü¡C ¤°»ò«¬ºAªºª«¥ó¥i¥HÂर»ò«¬ºA¡A¥u¦³µ{¦¡û¥i¥H´x´¤¡CC++¥u¯à´£¨Ñ¦³ªº¦w¥þÀˬd¡A¤£¯à§i¶D§A"¤@©w¤£¯àÂà" static_castªº¾A¥Î®É¾÷¡A¤@¯ëªº»¡ªk´N¬O:°òÃþ§Oª«¥óÂà´«¦Ül¥ÍÃþ§Oª«¥ó¡C(³o¦X©óstatic_castªºÀˬd±ø¥ó) C++¥»¨Ó´N¤£¬O¦w¥þ¾É¦Vªº»y¨¥¡A¤@Ó¥i¥Hª½±µ杂¨ú°O¾ÐÅ骺»y¨¥¡A¦p¦ó¦w¥þªk? C++¥¦¬O´£¨Ñ¼u©Ê¾É¦V(¨î³Ì¤Ö)ªº»y¨¥¡C³o¬O¥¦ªºÀuÂI¤]¬O¥¦ªº¯ÊÂI¡C
½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
|
|
|
2017/12/13 ¤U¤È 07:49:31
>>§Ú¥uÅ¥»¡ typeid Àˬd³q¹L¡A¤~¯à¥Î static_cast Â૬ >¨º¸ÌÅ¥»¡ªº? >¯à¤£¯àÂ૬¡Aµ{¦¡û¤~¦³¥D±±Åv¡C«ç»òÂà¡AC++´£¨Ñ¤Ó¦hºÞ¹D©M¤è¦¡(©Î»yªk)¡C >¦Ü©óÂà¤F¡Aµo¥Í¤°»ò¨Æ¡A¨º¬Oµ{¦¡ûªº³d¥ô¡C
¦]¬°¥u¦³ Base¡A¥¦¥i¥H¬O¥ô¦ó Derived ªº Base¡Aµ{¦¡ûn«ç»òt³d¥ô¡AY¤£¥Î dynamic_cast Âà¡A ´N¥u¥i¦b Base ³oÓ¼h±°µ¥æ¬y
>>¤º®e¤@¼Ë¥i¥H¥Î static_cast ¬O C ªº·§©À¡A¤£¯à¥Î¦b C++ >static_cast¬OC++¤~¦³ªº¡A¥Øªº¤]¤£¬O¬°¤F©MC¬Û®e(C++«O¯dC 쥻ªºcasting operator¤~¬O¬°¤F¬Û®e)
§Ú¬O»¡¤º®e¤@¼Ë¥Î¤£¦Pªº¼Ë»ª¥h¨Ï¥Î³oÓ·§©À
>static_cast¬O¦³Ãþ§OÄ~©Ó(¦å½tÃö«Y)Àˬdªº¡A³o¤]¬OC¨S¦³ªº¡C >¤@¼Ëªºª«¥ó¥i¥H¦b¤£¦Pªº¾Þ§@Ãþ§OÂà´«¡A¬Oµ{¦¡û»{¬°¨S°ÝÃD«á¥hÂà´«ªº(¦Ût³d¥ô)¡C¤£¬O¤å¥ó³o»ò»¡¡C
¦pªG¤£°µ classid Àˬd°µ¥¿½Tªº downcast Â૬¡A´N¥u¯à°µ°²Â૬¡A¦]¤£ª¾ Derived ¬O½Ö¡A¦Ó³o Ó°²Â૬´N¥u¯à¾Þ§@¨ì Base ³oÓ¼h¯Åªº¸ê®Æ¡A¨º´N¥Î Base ´N¦n¤F¡A¤£µM°ß¤@ªº²z¥Ñ´N¬O¬° Base ¼W¥[¾Þ§@¥\¯à¨ç¼Æ
>¦Ü©ó«ç»òÂà(¥ÎC++´£¨Ñªº¨º¤@ºØÂà´«¤è¦¡)¡A¨º¤]¬Oµ{¦¡ûªº¿ï¾Ü¡C >¤°»ò«¬ºAªºª«¥ó¥i¥HÂर»ò«¬ºA¡A¥u¦³µ{¦¡û¥i¥H´x´¤¡CC++¥u¯à´£¨Ñ¦³ªº¦w¥þÀˬd¡A¤£¯à§i¶D§A'¤@©w¤£¯àÂà'
>static_castªº¾A¥Î®É¾÷¡A¤@¯ëªº»¡ªk´N¬O:°òÃþ§Oª«¥óÂà´«¦Ül¥ÍÃþ§Oª«¥ó¡C(³o¦X©óstatic_castªºÀˬd±ø¥ó) >C++¥»¨Ó´N¤£¬O¦w¥þ¾É¦Vªº»y¨¥¡A¤@Ó¥i¥Hª½±µ杂¨ú°O¾ÐÅ骺»y¨¥¡A¦p¦ó¦w¥þªk? >C++¥¦¬O´£¨Ñ¼u©Ê¾É¦V(¨î³Ì¤Ö)ªº»y¨¥¡C³o¬O¥¦ªºÀuÂI¤]¬O¥¦ªº¯ÊÂI¡C > >½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 >¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
dynamuc_cast ¥u°µ¤@Óª«¥ó§t¦³ªº class ªºÂ૬¡A¤£t³d»Ý¨D³]p¡AÃö dynamuc_cast §¾¨Æ
¦Ó¥B§Ú¬O¥Î dynamuc_cast ¨ÓÀˬd clone() ªº¤À¨¡A¬O§_§t¦³©M¥»´Lªº¤@¼Ëªº¦¨¥÷¡A¥H§PÂ_ clone() ªº³]p¬O§_¦³°ÝÃD¡A ¸ò§Ú§è¤°»ò¦w¥þ¤£¦w¥þ
|
|
|
2017/12/13 ¤U¤È 10:48:43
>¦]¬°¥u¦³ Base¡A¥¦¥i¥H¬O¥ô¦ó Derived ªº Base¡Aµ{¦¡ûn«ç»òt³d¥ô¡A >Y¤£¥Î dynamic_cast Âà¡A´N¥u¥i¦b Base ³oÓ¼h±°µ¥æ¬y C++¦³¨º»ò¦hªºconversion¤è¦¡¡A«ç»ò·|¥u¯à¦b Base ³oÓ¼h±¨Ï¥Î? µ{¦¡¹ï¿ù¡A¥»¨Ó´N¬Oµ{¦¡ûnt³d¡A¤£µMn¥s½Öt³d?
>§Ú¬O»¡¤º®e¤@¼Ë¥Î¤£¦Pªº¼Ë»ª¥h¨Ï¥Î³oÓ·§©À §A¦³¬Ý¤F2017/12/12 ¤U¤È 05:23:19ªº¶K¤å¤F¶Ü? ¤£¦P¤j¤p¡A¨S¦å½t«¬ºAªºª«¥ó³£¥i¥HÂà¤F¡A¬Û¦PªºÃþ§Oª«¥ó´«¤£¦Pªº¾Þ§@¬°¤°»ò¤£¯àÂà? ¦Ñ¤ý¶}¤F¤@®a¤p¤½¥q¡A¶R¤F¤@½øAltis·í·~°Èªº¥æ³q¨®(¥æ³q¨®Ä~©ÓAltis)¡F «á¨Ó¦Ñ¤ý¦Ñ±C»¡¡A·Q¶R½øAltis·í®a¥Î¨®(®a¥Î¨®Ä~©ÓAltis)¥X¹C¨Ï¥Î¡C ¦Ñ¤ý·Q»¡¡A¥æ³q¨®¤Ö¥Î¡A¦Ó¥B®a¥Îªº®É¶¡´X¥G³£¦b«D¤W¯Z®É¶¡¡C ´N¸ò¦Ñ±C»¡¡A´N§â¤½¥q°µ¥æ³q¨®ªº¨º½øAltis¡A¦b¤U¯Z«á·í®a¥Î¨®¥i¥H¤@Á|¨â±o¡A¤S¬Ù¿ú¡C ¦Ñ±C°í«ù¤£¥«¡A»¡§Ún¬O®a¥Î¨®¡A¤½¥q¨º½ø¥s¥æ³q¨®¡A«ç»ò¥i¥H¡C¸£µ¬¤@©wn³o»ò¦º¶Ü?
>¦pªG¤£°µ classid Àˬd°µ¥¿½Tªº downcast Â૬¡A´N¥u¯à°µ°²Â૬¡A¦]¤£ª¾ Derived ¬O½Ö¡A ¤°»ò¥s°²Â૬? ¦³¬Ý¹L«e±ªº¨Ò¤l¶Ü? CString Ãþ§Oª«¥ó³£¥i¥HÂ૬¦¨char *¡A¥¦Ì¤§¶¡¦³Ä~©ÓÃö«Y¶Ü? int ³£¥i¥HÂ૬¦¨float¡A¥LÌ«¬§O¤£¦P¡A¤]¨S¦å½tÃö«Y¡A¬°¤°»ò¥i¥HÂà? §AÁ¿ªº¨ººØDowncast¬O¶°¦XÆ[¤§¤U¡A½s;¹¥i¥H§PÂ_Â૬¨S°ÝÃD¡C ¨ä¥¦½s;¹µLªk§PÂ_¡AnÂà´N¬Oµ{¦¡ûnª¾¹D¦Û¤v¦b°µ¤°»ò¡C¤£ª¾¹D¶ÃÂà´N¬O«áªG¦Ût¡C ¹³int©Mfloat¦]¬O¤º«Ø«¬§O¡A©Ò¥H½s;¹ª¾¹D¥¦Ì¬O¤°»òªF¦è¡An¤¬Âàn¨Ì¤°»ò³W«h¥hÂà¡C ¦pªG§ï¦¨¦ÛqÃþ§Oªºint©Mfloat¡A½s;¹´N¤£ª¾¥¦Ì¬O¤°»òªFªFªF¤F¡Cdynamic_cast Àˬd¤]¤@©w¤£·|¹L¡C ¦ý¯uªº¤£¯àÂà¶Ü?nÂà´N¥u¦³µ{¦¡ûª¾¹D«ç»òÂà¡Aµ²ªG¦Ût¡C ©³¤U¼g¤@Ó¼ÒÀÀint©Mfloat¤¬Â઺¨Ò¤l¡ACIntª«¥óÂনCFloat¡A¨S¦å½t(Ä~©Ó)Ãö«Y¡AÂà´«ºtºâ©M¤º«Ø«¬§OintÂàfloat¤@¼Ë¡A¦³¤°»ò¤£¥i¥H¶Ü? struct CFloat; struct CInt { int m_iInt; CInt(int i):m_iInt(i){} operator float() {return (float)m_iInt;} const CInt& operator =(int i) { m_iint = i; return *this; } virtual ~CInt() {} };
struct CFloat { float m_fFloat; CFloat(float f) :m_fFloat(f){} operator int() {return (int)m_fFloat;} const CFloat& operator =(float f) { m_ffloat = f; return *this; } virtual ~CFloat() {} };
int main() { Cint iObj(5); Cfloat fObj((float)1.23);
Cint *piObj= dynamic_cast<Cint *>(&fObj);//dynamic_cast±onull, ¥¢±Ñ! fObj = (float)iObj;//Â૬OK
Cfloat *pfObj = dynamic_cast<Cfloat *>(&iObj);//dynamic_cast±onull, ¥¢±Ñ! iObj = (int)fObj;//Â૬OK return 0; }
>¦Ó¥B§Ú¬O¥Î dynamuc_cast ¨ÓÀˬd clone() ªº¤À¨¡A¬O§_§t¦³©M¥»´Lªº¤@¼Ëªº¦¨¥÷¡A >¥H§PÂ_ clone() ªº³]p¬O§_¦³°ÝÃD¡A¸ò§Ú§è¤°»ò¦w¥þ¤£¦w¥þ ¨S¤°»ò°ÝÃD¡A´N¬O¥Î¦b§Ú§ïªºµ{¦¡¤£¶]¦Ó¤v¡Cµ{¦¡û¸Óµw°_¨Ó¦Û¤vºÞÂ૬®É¡Aµw¤£¤g¨Ó¦Ó¤v¡C
|
|
|
2017/12/13 ¤U¤È 10:59:56
CInt©MCFloat¥[¤W¤U±³o¨âÓoperator´N¥i¥Hª½±µ¤¬Âà: struct CInt{ operator CFloat() {} };
struct CFloat{ operator CInt() {} };
>¦Ó¥B§Ú¬O¥Î dynamuc_cast ¨ÓÀˬd clone() ªº¤À¨¡A¬O§_§t¦³©M¥»´Lªº¤@¼Ëªº¦¨¥÷¡A >¥H§PÂ_ clone() ªº³]p¬O§_¦³°ÝÃD¡A¸ò§Ú§è¤°»ò¦w¥þ¤£¦w¥þ ¤£¬O¥»´L¤£¤@©w´N¤£¯àÂà¡Aµ{¦¡ûª¾¹D«ç»òÂà´N¦n¡C ¦w¤£¦w¥þ¦^À³§A»{¬°dynamic_castªð¦^null´N¬O½Æ»s¤£§¹¥þ¡C dynamic_castªð¦^null¬Oªí¥Ü¤£¦w¥þ(¤£¥Nªí¤£¯àÂà)¡C¤£¬O½Æ»s¤£§¹¥þ¡C
|
|
|
2017/12/14 ¤W¤È 11:25:10
>>¦Ó¥B§Ú¬O¥Î dynamuc_cast ¨ÓÀˬd clone() ªº¤À¨¡A¬O§_§t¦³©M¥»´Lªº¤@¼Ëªº¦¨¥÷¡A >>¥H§PÂ_ clone() ªº³]p¬O§_¦³°ÝÃD¡A¸ò§Ú§è¤°»ò¦w¥þ¤£¦w¥þ >¤£¬O¥»´L¤£¤@©w´N¤£¯àÂà¡Aµ{¦¡ûª¾¹D«ç»òÂà´N¦n¡C >¦w¤£¦w¥þ¦^À³§A»{¬°dynamic_castªð¦^null´N¬O½Æ»s¤£§¹¥þ¡C >dynamic_castªð¦^null¬Oªí¥Ü¤£¦w¥þ(¤£¥Nªí¤£¯àÂà)¡C¤£¬O½Æ»s¤£§¹¥þ¡C
§Ú¬O¥Î dynamic_cast ¨ÓÀËÅç clone() ²£¥Íªº¤À¨©M¥»´L¬O§_¤@P¡A¥H§PÂ_ clone() ¬O¤£¬O³]p¥¿½T¡A §A¸ò§Ú§è¤F¦Ñ¥b¤Ñ¤]·d¤£²M·¡§A¹ï³o¼ËªºÀËÅç¤è¦¡¬O«ù¤°»òºA«×¡A©Ò¥H§Ú²{¦b©ú½T°Ý§A¡A§A¥un¦^µª¥H ¤U«¶KªºÀËÅç¤è¦¡¦³¨S¦³®Ä¡A¬O§_¨¬¥i§PÂ_ clone() ªº¥¿½T©Ê¡A³o¼Ë´N¦n
#include <iostream> #include <string>
using namespace std;
class Base { public: ¡@virtual Base *Clone() ¡@{ ¡@¡@return new Base(*this); ¡@} };
class Derived3 :public Base { public: ¡@virtual Base *Clone() override¡@ ¡@{ ¡@¡@return new Derived3(*this); ¡@} };
class Derived4 :public Base { public: };
int main() { ¡@Base *pBase3 = new Derived3; // ¥»´L ¡@Base *clone_pBase3 = pBase3->Clone(); // ¤À¨
¡@cout << "Derived3 ¥»´L¡G"; ¡@if (dynamic_cast<Derived3*>(pBase3)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << "Derived3 ¤À¨¡G"; ¡@if (dynamic_cast<Derived3*>(clone_pBase3)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << endl;
¡@Base *pBase4 = new Derived4; // ¥»´L ¡@Base *clone_pBase4 = pBase4->Clone(); // ¤À¨
¡@cout << "Derived4 ¥»´L¡G"; ¡@if (dynamic_cast<Derived4*>(pBase4)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@cout << "Derived4 ¤À¨¡G"; ¡@if (dynamic_cast<Derived4*>(clone_pBase4)) ¡@¡@cout << "§¹¥þ" << endl; ¡@else ¡@¡@cout << "¤£§¹¥þ" << endl;
¡@return 0; }
°õ¦æµ²ªG¡G Derived3 ¥»´L¡G§¹¥þ Derived3 ¤À¨¡G§¹¥þ
Derived4 ¥»´L¡G§¹¥þ Derived4 ¤À¨¡G¤£§¹¥þ ½Ð«ö¥ô·NÁäÄ~Äò . . .
|
|
|
2017/12/14 ¤U¤È 02:19:44
>§Ú¬O¥Î dynamic_cast ¨ÓÀËÅç clone() ²£¥Íªº¤À¨©M¥»´L¬O§_¤@P¡A¥H§PÂ_ clone() ¬O¤£¬O³]p¥¿½T¡A >§A¸ò§Ú§è¤F¦Ñ¥b¤Ñ¤]·d¤£²M·¡§A¹ï³o¼ËªºÀËÅç¤è¦¡¬O«ù¤°»òºA«×¡A©Ò¥H§Ú²{¦b©ú½T°Ý§A¡A§A¥un¦^µª¥H >¤U«¶KªºÀËÅç¤è¦¡¦³¨S¦³®Ä¡A¬O§_¨¬¥i§PÂ_ clone() ªº¥¿½T©Ê¡A³o¼Ë´N¦n ¦P¼Ëªº°ÝÃD³£¤£ª¾¦^¦h¤Ö¦¸¤F¡A¦A¦^¦³¤°»ò·N¸q¶Ü? dynamic_cast¥u¬OÀËÅçÄ~©ÓÃö«Y¡A©Î»¡Âà´«¥Ø¼Ð©M¨Ó·½ªºì¥ÍÃþ§OÃö«Y¡C©M¥»´L©Î½Æ»s¬O§_§¹¥þ®Ú¥»¨SÃö«Y¡C §An¥Îdynamic_cast¨S¤H¸T¤î§A¡A¦ý¥Îdynamic_cast¤£¯à¤u§@¡A§An°í«ù¥Î¤£¯àworkªº¤è¦¡¡A¥Ñ§A¡C ¦ý¤H®a§i¶D§A¥i¥Hstatic_cast¸Ñ¨M¡A§A»¡§O¤H¤£¯à¥Îstatic_cast¤~¬O쪧ij©Ò¦b§a? ÁÙ¬O«ÂЪºµ{¦¡¡AÁٻݦ^µª¶Ü? OOPªºÄ~©Ó¥Dn´N¬O¯à©µ¥Î°òÃþ§O¡A§A¨ºµ{¦¡¥»¨¦bOOPÆ[ÂI´N¦³«Ü¤jªº°ÝÃD¡A«on¤H®a¸Ñ¨Mªº¤èªkn¦hOOP¡C §O¤H¸Ñ¨M¤è¦¡¥»¨Ó´N¬OOOP¤¹pªºÂà´«¡A¦Ñ¥Î¤°»òºë¯«¡A§¹¤£§¹¥þ¡AÅ¥»¡¡A¨Ó·e¶ë¡C
½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
¤£¯à²z¸Ñ³o¨âÓ¶K¤å¡A´NµLªk¯}°£§A¨ºdynamic_cast¦Ü¤WÅv«Âªº°g«ä¡C©Ò¥H¥ý»{¯u¦^¡C
|
|
|
2017/12/14 ¤U¤È 03:10:20
¬Ý³o¬qmsdn¹ïstatic_castªº»¡©ú¡F https://msdn.microsoft.com/zh-tw/library/c36yw7x9.aspx static_cast ¥i¥H¶i¦æ¤Ï¦VÁô§tÂà´«¡A¦Ó¨äµ²ªG·|¬O¥¼©w¸q¡C µ{¦¡³]p¤Hû¥²¶·½T»{ static_cast Âà´«ªºµ²ªG¬O§_¦w¥þ¡C ¦¹¦æ¬°¤]¾A¥Î©óÃþ§OÃþ«¬¥H¥~ªºÃþ«¬¡C ¨Ò¦p¡A±z¥i¥H¨Ï¥Î static_cast ±N int Âà´«¬° char¡C ¤£¹L¡A²£¥Íªº char ªº¦ì¤¸¥i¯à¤£¨¬¥Hªí¥Ü¾ãÓ int È¡C ¦P¼Ë¦a¡Aµ{¦¡³]p¤Hû¥²¶·½T»{ static_cast Âà´«ªºµ²ªG¬O§_¦w¥þ¡C static_cast ¹Bºâ¤l¤]¥i¥Î©ó°õ¦æ©Ò¦³Áô§tÂà´«¡A¥]¬A¼Ð·ÇÂà´«©M¨Ï¥ÎªÌ©w¸qªºÂà´«¡C
ª`·N«á¤@¥y:¥]¬A...¨Ï¥ÎªÌ©w¸qªºÂà´«¡C ·Q·Q¤°»ò¬O¨Ï¥ÎªÌ©w¸qªºÂà´«¡A¨ºµ´¹ï¤£¬O§A¨º¥»´LÂà´«ªº½d³ò§a¡I Á٧ˤ£²Mµ{¦¡û¦p¦ót³d¡A³o¤@¬q¸Ü¤]¬O¤@ª½´£¥Ü¡C µ²½×´N¬O¡Aª«¥ó«¬§OÂà´«¡A¨S¤°»òµ´¹ï¤£¥i¥H¡A´N¬Oµ{¦¡û¥D±±¡Aµ{¦¡¦w¥þ¦Û¤vt³d¡C
½Ð»{¯u¦^2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51 ¤×¨ä¬O2017/12/11 ¤U¤È 03:34:51¦³¤@¬q³q°Tªº¨Ò¤l¡A¤£¯à¥Îdynamuc_cast(¥Î¤F¤]¤£·|¹L)¡A¨ºn¦p¦ó¼¶¼g³oºØ»Ý¨Dªºµ{¦¡?
|
|
|
2017/12/15 ¤U¤È 12:24:22
>>§Ú¬O¥Î dynamic_cast ¨ÓÀËÅç clone() ²£¥Íªº¤À¨©M¥»´L¬O§_¤@P¡A¥H§PÂ_ clone() ¬O¤£¬O³]p¥¿½T¡A >>§A¸ò§Ú§è¤F¦Ñ¥b¤Ñ¤]·d¤£²M·¡§A¹ï³o¼ËªºÀËÅç¤è¦¡¬O«ù¤°»òºA«×¡A©Ò¥H§Ú²{¦b©ú½T°Ý§A¡A§A¥un¦^µª¥H >>¤U«¶KªºÀËÅç¤è¦¡¦³¨S¦³®Ä¡A¬O§_¨¬¥i§PÂ_ clone() ªº¥¿½T©Ê¡A³o¼Ë´N¦n >¦P¼Ëªº°ÝÃD³£¤£ª¾¦^¦h¤Ö¦¸¤F¡A¦A¦^¦³¤°»ò·N¸q¶Ü?
¨º§A¦A¦^µª§Ú¡A§A»¡ªº¨º¨Ç¬O¥Î¨ÓÃÒ©ú¥Îªº¶Ü¡AY¤£¬O¥Î¨ÓÃÒ©ú¡A¨º»ò¦³Ãö«Y¶Ü¡AY¤£¬O¥Î¨ÓÃÒ©ú¤S¨SÃö«Y¡A´N¤£¥Î¦b³oªO°Q½×¤F
¥H¤UY§A½T©w©M¥»ªOµLÃö¡A«ØÄ³§A¥t¶}¤@ÓªO°Q½×
#include <iostream> using namespace std;
class Base { public: ¡@double m_doubleValue; ¡@virtual ~Base(){} };
class Derived1:public Base { ¡@long m_Value; public: };
class Fake1 :public Base { public: ¡@void Set(double V) ¡@{ ¡@¡@m_doubleValue = V; ¡@} };
void Set(Base *pBase, double V) { ¡@pBase->m_doubleValue = V; }
int main() { ¡@Base *pBase = new Derived1;
¡@// ³o¼ËÁٺⱡ¦³¥iì¡A·í§@¬O¬° Base ¾÷°Êªº¼W¥[¥\¯à¨ç¼Æ ¡@Fake1 *pFake1 = static_cast<Fake1 *>(pBase); ¡@// ³o¨âÓµ¥»ù ¡@pFake1->Set(12); ¡@Set(pBase, 12);
¡@// ³o¬O pBase ©Ònªº¡A¦]¦P¤@Óª«¥óªº¤¶± ¡@Derived1 *pDerived1 = dynamic_cast<Derived1*>(pBase);
¡@return 0; }
·í§Ú®³¨ì pBase ®É¡A§Ú¬O§â¥¦·í§@¬O pDerived1¡A®³¨ì¤@Ó Base ¥u·í¥¦¬O¤@Ó Derived¡A¦]¬O¦P¤@Óª«¥ó
¦Ó¤@Ó pBase ¥i¥H¦³µL¼ÆÓ pFake1¡A¦]¤@Ó Base ¥i¥HÂàÅܦ¨µL¼ÆºØ Fake¡A ¤]¥i¥H¥áµ¹µL¼ÆºØªº¨ç¼Æ¡A¥un³o¨Ç¨ç¼Æ±µ¨ü Base¡A Fake ´N©M¨º¨Ç¨ç¼Æ¤@¼Ë¡A¥u¬O¤@ºØ¥\¯àÀ³¥Î³]p¡A¤£¬Oª«¥óªº¤@³¡¥÷
|
|
|
2017/12/15 ¤U¤È 05:52:56
>¨º§A¦A¦^µª§Ú¡A§A»¡ªº¨º¨Ç¬O¥Î¨ÓÃÒ©ú¥Îªº¶Ü¡AY¤£¬O¥Î¨ÓÃÒ©ú¡A¨º»ò¦³Ãö«Y¶Ü §A¤@ª½¦b¼Ò½k«ÂI¡C ª§Ä³¬O±q2017/11/7 ¤U¤È 09:49:30¶}©lªº¡A½Ð¦^ÀY¬Ý¬Ýª§Ä³ÂI¬O¤°»ò¡C §Ú2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51¨â½g¶K¤å¡A´N¬O¦b»¡©ústatic_cast¨Ï¥Îªº®É¾÷©M¦Xªk©Ê¡C
§A¥un²z¸Ñ§ÚCoordinate¬O¥i¥H³o¼Ë¼g¡A¨º»ò2017/11/22 ¤W¤È 01:20:31¶K¤å¸ÌªºDerived3¡ADerived4´N¥i¥H¨º¼Ë¼g¡C Derived3¡ADerived4 OK¨º´N¯}¸Ñ:¤@©wnÂмgclonªº¥²n©Ê¡C ©Ò¥H´N´N¦^¨ìì°ÝÃD:¦pªGl¥ÍÃþ§Oı±o¨S¥²nÂмg¨ç¦¡¡A¬°¦ó¤@©wn³Q±j¢Âмg¨ç¦¡¡C(³o¹H¤ÏOOP Ä~©Ó½Æ¥Îªºì«h)
YÁÙ¦³°ÝÃD¡A½Ð¦A¥J²Ó°Ñ¦Ò2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51¨â½g¶K¤å©MMSDN¹ïstatic_castªº»¡©ú¡C Y¨S°ÝÃD´N¦^¨ì"¦pªGl¥ÍÃþ§Oı±o¨S¥²nÂмg¨ç¦¡¡A¬°¦ó¤@©wn³Q±j¢Âмg¨ç¦¡¡C"³oÓÄpµ²ÂI¤W¨Ó¡C ¨ä¥¦¤@ª½§á¦±§O¤H·N«ä¡A¦AÅý§O¤@½a©ó¼á²Mªº°Q½×¡A´N¥i§K¤F¡C
|
|
|
2017/12/16 ¤W¤È 11:06:02
>>¨º§A¦A¦^µª§Ú¡A§A»¡ªº¨º¨Ç¬O¥Î¨ÓÃÒ©ú¥Îªº¶Ü¡AY¤£¬O¥Î¨ÓÃÒ©ú¡A¨º»ò¦³Ãö«Y¶Ü >§A¤@ª½¦b¼Ò½k«ÂI¡C >ª§Ä³¬O±q2017/11/7 ¤U¤È 09:49:30¶}©lªº¡A½Ð¦^ÀY¬Ý¬Ýª§Ä³ÂI¬O¤°»ò¡C >§Ú2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51¨â½g¶K¤å¡A´N¬O¦b»¡©ústatic_cast¨Ï¥Îªº®É¾÷©M¦Xªk©Ê¡C > >§A¥un²z¸Ñ§ÚCoordinate¬O¥i¥H³o¼Ë¼g¡A¨º»ò2017/11/22 ¤W¤È 01:20:31¶K¤å¸ÌªºDerived3¡ADerived4´N¥i¥H¨º¼Ë¼g¡C >Derived3¡ADerived4 OK¨º´N¯}¸Ñ:¤@©wnÂмgclonªº¥²n©Ê¡C >©Ò¥H´N´N¦^¨ìì°ÝÃD:¦pªGl¥ÍÃþ§Oı±o¨S¥²nÂмg¨ç¦¡¡A¬°¦ó¤@©wn³Q±j¢Âмg¨ç¦¡¡C(³o¹H¤ÏOOP Ä~©Ó½Æ¥Îªºì«h) > >YÁÙ¦³°ÝÃD¡A½Ð¦A¥J²Ó°Ñ¦Ò2017/12/12 ¤U¤È 05:23:19 ©M 2017/12/11 ¤U¤È 03:34:51¨â½g¶K¤å©MMSDN¹ïstatic_castªº»¡©ú¡C >Y¨S°ÝÃD´N¦^¨ì'¦pªGl¥ÍÃþ§Oı±o¨S¥²nÂмg¨ç¦¡¡A¬°¦ó¤@©wn³Q±j¢Âмg¨ç¦¡¡C'³oÓÄpµ²ÂI¤W¨Ó¡C >¨ä¥¦¤@ª½§á¦±§O¤H·N«ä¡A¦AÅý§O¤@½a©ó¼á²Mªº°Q½×¡A´N¥i§K¤F¡C
Y¤£¹ê§@ Clone()¡A·í§A®³¨ì Base *pBase¡A³oÓ pBase ¬OµL¼ÆºØ Derived ªº Base¡A§A«ç»òª¾¹Dn«ç»ò clone
|
|
|
2017/12/16 ¤U¤È 01:58:08
>Y¤£¹ê§@ Clone()¡A·í§A®³¨ì Base *pBase¡A³oÓ pBase ¬OµL¼ÆºØ Derived ªº Base¡A§A«ç»òª¾¹Dn«ç»ò clone ·íDerived3¨M©w§âclone¥æµ¹Base®É¡A´Nªí¥Ü¥þÅv¥æµ¹Base clone(µ{¦¡ûª¾¹D¦b°µ¤°»ò); YDerivedX»{¬°詃¦³¦Û¤vªºclone´N·|¹ê°µ¦Û¤vªºclone¡C µ²ªGµL¼ÆºØDerivedªºBase³£·|©I¥s¦U¦ÛDerived©Ò³]·Qªºclone(¤£½×¬O¦Û¤v¹ê§@譞¬O¥æµ¹Base)¡C
|
|
|
2017/12/16 ¤U¤È 02:59:23
>>Y¤£¹ê§@ Clone()¡A·í§A®³¨ì Base *pBase¡A³oÓ pBase ¬OµL¼ÆºØ Derived ªº Base¡A§A«ç»òª¾¹Dn«ç»ò clone >·íDerived3¨M©w§âclone¥æµ¹Base®É¡A´Nªí¥Ü¥þÅv¥æµ¹Base clone(µ{¦¡ûª¾¹D¦b°µ¤°»ò); >YDerivedX»{¬°詃¦³¦Û¤vªºclone´N·|¹ê°µ¦Û¤vªºclone¡C >µ²ªGµL¼ÆºØDerivedªºBase³£·|©I¥s¦U¦ÛDerived©Ò³]·Qªºclone(¤£½×¬O¦Û¤v¹ê§@譞¬O¥æµ¹Base)¡C
¥i¬O³o¼Ë¦³¨âÓ°ÝÃD
1. Y Derived ¨S¹ê§@ Clone()¡A¥»´L©M¤À¨·|¦³¤£¦P¦¨¥÷¡A§Y most derived ·|¤£¦P¡A³o¼Ë¬O¤£¬O¦³¹H Clone() ªº¥»·N 2. Derived ¨S¹ê§@ Clone() ¨Æ¹ê¤W¬OÀˬd¤£¥X¨Óªº¡A§Ú¥Î dynamic_cast °µÀˬd¬O¨Æ¥ý¤wª¾ pBase ªº Derived ¬O½Ö¡AY¨S¹ê§@¨Æ¹ê¤W¤À¨¤]¯à¥¿±`°õ¦æ¡A¥u¬O¦b¿ù»~¤¤°õ¦æÁÙ´ýµM¤£ª¾¡A©Ò¥H±j¨î¹ê§@¬O¥²nªº
|
|
|
2017/12/16 ¤U¤È 05:50:13
>1. Y Derived ¨S¹ê§@ Clone()¡A¥»´L©M¤À¨·|¦³¤£¦P¦¨¥÷¡A§Y most derived ·|¤£¦P¡A³o¼Ë¬O¤£¬O¦³¹H Clone() ªº¥»·N ¤£·|¡Aderivedªº¦¨¸ê®Æ©MBase¤£¦P¡A¥¦´N¦Û¤vn°µclone¡A¨S¤H¨î¥¦¤£¯à¹ê§@¦Û¤vªºclone(¦ý§Aªºclone½d¨Ò¤£¯à³Qderived©I¥s¡A·|¦³°ÝÃD¡A¦ý¥ý¤£½Í³oÓ)¡C ¦ý¤Ö³¡¥÷ªºderived¸ê®ÆY§¹¥þ©MBase¤@¼Ë¡A§Y¨Ï¥u¦³¦Ê¤À¤§¤@¡A³o¦Ê¤À¤§¤@¬°¤°»òn³Q±j¢¹ê§@clone?³o¦³¹HOOPÄ~©Ó¥»·N¡C
>2. Derived ¨S¹ê§@ Clone() ¨Æ¹ê¤W¬OÀˬd¤£¥X¨Óªº¡A§Ú¥Î dynamic_cast °µÀˬd¬O¨Æ¥ý¤wª¾ pBase ªº Derived ¬O½Ö¡A >Y¨S¹ê§@¨Æ¹ê¤W¤À¨¤]¯à¥¿±`°õ¦æ¡A¥u¬O¦b¿ù»~¤¤°õ¦æÁÙ´ýµM¤£ª¾¡A©Ò¥H±j¨î¹ê§@¬O¥²nªº ¦pªG¤£¥Î±j¢¹ê§@¡A¯à¤£¯àÀˬd¥X¨Ó¦³¨S¦³¹ê§@´N¤£¬O«ÂI¡C ¤£À´"¯à¥¿±`°õ¦æ¡A¥u¬O¦b¿ù»~¤¤°õ¦æÁÙ´ýµM¤£ª¾"¡A¯à¥¿±`°õ¦æªºµ{¦¡¡A´N¬O¨S¦³¿ù»~¡A¤£¬O¶Ü? §Ú¨ºCoordinate¦X¥GC++³W½d¡A¤]¨S¦³¿ù»~¡A§AnÀˬd¥¦¤°»ò? ª«¥ó«¬ºAÂà´«¡A¬O§_¦³¿ù¡An¬Oµ{¦¡û¦Û¤vnt³d¡A¤£¬O¾a½s;¹Àˬd¡A§ó¤£¬O¾a±j¢¹ê§@clone¡C Ãø¹D¦³¹ê§@cloneªºderived´N¤£·|¥X¿ù¶Ü?
|
|
|
2017/12/17 ¤W¤È 11:36:51
¦]¬°·|¦³¥H¤U°ÝÃD¡A©Ò¥H¶·±j¨î¹ê§@
#include <iostream> using namespace std;
class Base { public: ¡@virtual ~Base() {}
¡@virtual void SayHello() ¡@{ ¡@¡@cout << "I am Base" << endl; ¡@}
¡@virtual Base* Clone() ¡@{ ¡@¡@return new Base; ¡@} };
class Derived1 :public Base { public: ¡@virtual void SayHello() ¡@{ ¡@¡@cout << "I am Derived1" << endl; ¡@}
¡@virtual Base* Clone() ¡@{ ¡@¡@return new Derived1; ¡@} };
class Derived2 :public Base { public: ¡@virtual void SayHello() ¡@{ ¡@¡@cout << "I am Derived2" << endl; ¡@} };
int main() { ¡@Base *pBase = new Derived1; ¡@Base *pCloneBase = pBase->Clone(); ¡@pCloneBase->SayHello(); // I am Derived1
¡@pBase = new Derived2; ¡@pCloneBase = pBase->Clone(); ¡@pCloneBase->SayHello(); // I am Base
¡@return 0; }
°ÝÃD¦b Derived2 ¨S¦³¹ê§@ Clone()
|
|
|
2017/12/17 ¤U¤È 04:53:13
>¦]¬°·|¦³¥H¤U°ÝÃD¡A©Ò¥H¶·±j¨î¹ê§@ >class Base >{ >public: >¡@virtual ~Base() {} >¡@virtual void SayHello() >¡@{ >¡@¡@cout << "I am Base" << endl; >¡@} >¡@virtual Base* Clone() >¡@{ >¡@¡@return new Base; >¡@} >}; > >class Derived2 :public Base >{ >public: >¡@virtual void SayHello() >¡@{ >¡@¡@cout << "I am Derived2" << endl; >¡@} >};
>int main() >{ >¡@pBase = new Derived2; >¡@pCloneBase = pBase->Clone(); >¡@pCloneBase->SayHello(); // I am Base > >¡@return 0; >} > >°ÝÃD¦b Derived2 ¨S¦³¹ê§@ Clone()
²×©ó¬O¦^¨ì±j¨î¹ê§@»Ý¨Dªº°ÝÃD¤F¡C §A³oÓ¨Ò¤l¡An¹F¨ìSayHello()¥i¥H¥¿½T¦L¥X¨¥÷ªº¥Øªº¡A»Ýnclone©MSayHello³£n±j¨î¹ê§@¤~¦¨¡A¬O¤£¬O? cloneªº°ÝÃD¡A«e±½Í¹L¤F¡ASayHelloªº¨Ò¤l¡A¦b§Ú¨Ó¬Ý¡A¥¦¥u¬O¦b®i¥Ül¥ÍÃþ§O¨S¦³Âмg°òÃþ§OµêÀÀ¨ç¦¡®É¡A©I¥sªº¬O°òÃþ§OµêÀÀ¨ç¦¡¦Ó¤v¡C Y¬OÀˬdl¥ÍÃþ§O¬O§_¦³Âмg¨¡Ó¨ç¦¡¡A¨ä¹ê¥ÎrttiÀˬd´N¥i¥Hª¾¹D¡C¦ý³oÀˬdªº·N¸q¬O¤°»ò?¦Ü¤Ö¤£·|¸ò»Ý¤£»Ýn±j¨î¹ê§@¦³Ãö«Y§a? §ÚÁÙ¬O¥ÎDerived3¨Ó»¡©ú¡C §AªºDerived1¨Ò¤l¦³¨Ì§An¨DÂмgclone©MSayHello¡A¨S°ÝÃD¡A¬O§a? ¨º§Ú¦pªG¼g¤@ÓDerived3¡A¤@¼Ë¥u¬O¬°¤F×¹¢Derived1¡A§Ú¨Ã¤£·Q§ïÅÜDerived1¤°»ò¡A¥]¬AÃþ§O¦WºÙ¡CDerived3¦³¨S¦³¤£Âмgclone©MSayHelloªº¿ï¾ÜÅv? §Úªº·N«ä¬O¡A³]pDerived3®É¡Aµ{¦¡û»{¬°¨Ï¥Î°òÃþªºclone©MSayHello¹ïDerived3¨S¤°»ò¼vÅT¡A¤]¥´ºâ©µ¥Î¡A¬°¤°»ò¤@©wn¦bDerived3Âмg¥¦Ì? ¨à¤l·QɦѪ¨ªº¨®¤l¸ü¤kªB¤Í¥hª±¤@¤Ñ¡A¦Ñª¨»¡:¥i¥H¡A¦ý§An¥ý§â¨®¤l¹L¤áµ¹¦Û¤v¡A¥Î§¹¦A¹L¤á¦^¨ÓÁÙµ¹§Ú¡C ¨à¤l¤lı±o¦n³Â·Ð¡A¦^»¡:¤£¹L´NÉ¥ÎÓ¤@¤Ñ¡A´Nn¿ì¹L¤á¡A¦³³o»òÄY«¶Ü?
|
|
|
2017/12/17 ¤U¤È 05:19:23
>§Úªº·N«ä¬O¡A³]pDerived3®É¡Aµ{¦¡û»{¬°¨Ï¥Î°òÃþªºclone©MSayHello¹ïDerived3¨S¤°»ò¼vÅT¡A¤]¥´ºâ©µ¥Î¡A¬°¤°»ò¤@©wn¦bDerived3Âмg¥¦Ì?
¦]¬°¥u¯à±q Base ³oÓ¤¶±¶i¦æ¾Þ§@¡ADerived3 ¤£Âмg Clone()¡A¦b pCloneBase ±N¤£¦s¦b Derived3
|
|
|
2017/12/17 ¤U¤È 06:46:29
>¦]¬°¥u¯à±q Base ³oÓ¤¶±¶i¦æ¾Þ§@¡ADerived3 ¤£Âмg Clone()¡A¦b pCloneBase ±N¤£¦s¦b Derived3 Derived3¦pªG¤£¦b¥G©O?¦b³]pDerived3®É´N¤£¥´ºâ¦b¥G¦Û¤v¦s¤£¦s¦b¡C¦pªGDerived3¦³¥[¤F¤@Ө禡¡A»Ý¥Î®É´N¼È®Écast¦¨¦¨Derived3¡A´N¥i¥H¡C ¨à¤lnɦѪ¨ªº¨®¶}¡A´N¼È®É±aµÛ¦Ñª¨ªº¦æ·Ó´N¥i¥H¤F¡A¤£»Ýnªk«ß±j¨în¹L¤á(¦æ·Ó¤@©w¬On¶}¨®ªÌªº¦W¤l)¡C
|
|
|
2017/12/17 ¤U¤È 06:46:58
> > >>§Úªº·N«ä¬O¡A³]pDerived3®É¡Aµ{¦¡û»{¬°¨Ï¥Î°òÃþªºclone©MSayHello¹ïDerived3¨S¤°»ò¼vÅT¡A¤]¥´ºâ©µ¥Î¡A¬°¤°»ò¤@©wn¦bDerived3Âмg¥¦Ì? > >¦]¬°¥u¯à±q Base ³oÓ¤¶±¶i¦æ¾Þ§@¡ADerived3 ¤£Âмg Clone()¡A¦b pCloneBase ±N¤£¦s¦b
1. §Aªº Derived3 ¨S¼vÅT¡A¤£¥Nªí§O¤Hªº Derived3 ¨S¼vÅT 2. §Aªº Derived3 ¥i¥Î©ó pBase¡A¤@¼Ë¥i¥H¥Î©ó pCloneBase
Åv¿Å±o¥¢¤@©wn±j¨î¹ê§@ Clone()
|
|
|
2017/12/17 ¤U¤È 08:40:16
>1. §Aªº Derived3 ¨S¼vÅT¡A¤£¥Nªí§O¤Hªº Derived3 ¨S¼vÅT ¹ï°Ú¡I ¦³¼vÅTªº´N¦Û¤vÂмgClone/SayHello;¨S¼vÅTªº´N¤£¥ÎÂмg¡C ¤£¬O¤@ª½³£³o¼Ë»¡ªº¶Ü?¬°¤°»ò¦³¼vÅTªºn±j¨î¨S¼vÅTªºnÂмg? Y»¡¡A³o¼Ë¤ñ¸û¦w¥þ¡C¤£Âмg°òÃþ¨ç¦¡·|³y¦¨¿ù»~ªºµ{¦¡¡A¦h¦p¤û¤û¡C n·ÓÅU¤]·ÓÅU¤£§¹¡I(°ò¥»¤W¡A¥un¤£¬O¶Ã¼g¡C©Ò¦³Âмg¨ç¦¡¦¨ûªºµ{¦¡¡AY¤£Âмg´X¥G³£¬O¦³°ÝÃDªº) ¸Ó¤£¸ÓÂмg¡A´N¬Oµ{¦¡û¦Û¤v·Q¡A¦Û¤v¨M©w¡A¦Û¤vt³d¡C¤£¬O¥Ñ°òÃþ§O§i¶D¥L¡Cµ²ªG³s¥i¥H¤£Âмgªº³£n³Q±j¢Âмg¡C
>2. §Aªº Derived3 ¥i¥Î©ó pBase¡A¤@¼Ë¥i¥H¥Î©ó pCloneBase >Åv¿Å±o¥¢¤@©wn±j¨î¹ê§@ ¤£Âмgªºµ²ªG¡A´N¬ODerived3»{¬°¥¦¥i¥H©µ¥Î°òÃþª«¥ó©M¨¥÷¡A¤]¥i¥HÂ૬¨ìDerived3¨Ó¾Þ§@(¤@¯ë´N¬ODerived3¨S¦Û¤vªº¸ê®Æû)
|
|
|
2017/12/17 ¤U¤È 10:08:48
¥\¤O´N¦b³o¤F¡Aµ´¤£·|Åý·å²««~¦³¾÷·|¥X²{¡A¶Rªº¦w¤ß¡A½æªº¤]©ñ¤ß
|
|
|
2017/12/17 ¤U¤È 10:41:04
>¥\¤O´N¦b³o¤F¡Aµ´¤£·|Åý·å²««~¦³¾÷·|¥X²{¡A¶Rªº¦w¤ß¡A½æªº¤]©ñ¤ß ¨º¬O¤£¥i¯àªº¨Æ¡I µ{¦¡ªºÀu¦H¹ï¿ù¤ªá¤Kªù¡C ¦pªGµ{¦¡û³s¸Ó¤£¸ÓÂмgÄ~©Ó¤U¨Óªº¨ç¦¡³£·d¤£²M·¡¡A¼g¥X¨Óªºµ{¦¡·|Åý¤H©ñ¤ß? Ä~©Óªººë¯«´N¬Oµ{¦¡½X¥i¥H½Æ¥Î©Î§ï¼g¡A´Nºâ§ï¼g¤j³¡ªº±¡ªp¤]·|©I¥s°òÃþ¨ç¦¡¡C ¦ý¦³«Ü¦h±¡ªp¬O¡AÃþ§O©Î¨ç¦¡¦¨û¬O¤£§Æ±æ¦A³QÄ~©Óªº¡A³o´N¬Oc++1.1·s¼Wªºfinal¡C ¬Jn§O¤HÄ~©Ó¤S¤£µ¹Ä~©ÓªÌ©I¥s¨Ï¥Î¡A¬O¹H¤ÏÄ~©Óºë¯«ªº¡C¹³§Aªºclone¡A¤@¯ëclone¤£¬O¥u¥Î¹w³]ªº½Æ»s«Øºc¤l´N¥i¥Hªº¡C ÁÙn¦Û¦æºÞ²z¤@¨ÇÃþ§O¸ê®Æ¦¨ûªº½Æ»s¡C³o¨Ç¦¨ûY¬O¦b°òÃþprivate¡Aclone¤S¤£µ¹l¥ÍÃþ§O©I¥s¡Aµ{¦¡´X¥G¬O¼g¤£¤U¥hªº¡C ´Nºâ³o¨Ç¸ê®Æ¬O¦bprotected©Îpublic¡Anl¥ÍÃþ§Oªºclone¥ht³d°òÃþªºclone¤u§@¤]¬O«Ü©Çªº¡C ¼g¤@Ó³o»ò©Çªºclone¡A¤S¹F¤£¨ì»¡ªA¤H¬°¤°»ò±j¨îÂмg¬O¥²nªº¡C ©Î³\must¦³¤°»òcase¬O¦³»Ýnªº(Y¦³¡A§Ú¤]¦³¿³½ìª¾¹D)¡A¦ýcloneµ´¤£·|¬OÓmust»Ýnªº¦n½d¨Ò¡C
|
|
|
2017/12/17 ¤U¤È 11:02:03
cloneµ´¹ï¬Omust»Ýnªº¦n½d¨Ò¡A¦]¬°¦³ wiki I®Ñ:
§J¶©¡]^语¡GClone¡^¦b¼s¸q¤W¬O«ü§Q¥Î¥Íª«§Þ术¥ÑÆÓ©Ê¥Í´Þ产¥ÍÉOì个Ê^¦³§¹¥þ¬Û¦P°ò¦]组¤§¦Z¥Nªº过µ{¡C
Y§J¶©¥X¨Óªº¤À¨©M¥»´L¤£¤@¼Ë¡A¨º¤~·|Åý¤HºÃ´b
|
|
|
2017/12/18 ¤W¤È 12:14:04
§c clone ¸ò accept À³¸Ó¬O¾A¦X must ¨S¿ù°Õ ³o¯uªº¤£¥Îª§¡A¤@¶}©l°Q½×ªº´N¬O³oÓ ¨Ï¥Î¤£¦PÄ~©Ó¬[ºc¬O¥Ø«e¤ñ¸û¦X²zªº¸Ñ¨M¤èªk §A¥Î¦h«Ä~©Ó¨Ó±j¨î must ¨ä¹ê¦³Ó°ÝÃD ·í§A¼g PROTOTYPE_BASE_CRTP ªº®ÉÔ ¨ä¹ê´N¬O§Aª¾¹Dn§ï¼g¨º¨Ç¨ç¼Æªº®ÉÔ¤F : -)
|
|
|
2017/12/18 ¤U¤È 01:09:29
>·í§A¼g PROTOTYPE_BASE_CRTP ªº®ÉÔ >¨ä¹ê´N¬O§Aª¾¹Dn§ï¼g¨º¨Ç¨ç¼Æªº®ÉÔ¤F : -)
PROTOTYPE_BASE_CRTP °ÝÃD«Ü¦h¡A¤]§Ñ¤F¦³þ¨Ç°ÝÃD¤F ²{¦b¬O¥Î ¤¶±Ä~©Ó+²Õ¦X¡A¦ý¥Î³o¤èªkn¦³¦³¤Oªºª«¥óºÞ²z°µ«á¬Þ ©Ò¥H must ¬O³Ì²³æªº¤èªk
|
|
|
2017/12/18 ¤U¤È 02:43:03
>PROTOTYPE_BASE_CRTP °ÝÃD«Ü¦h¡A¤]§Ñ¤F¦³þ¨Ç°ÝÃD¤F >²{¦b¬O¥Î ¤¶±Ä~©Ó+²Õ¦X¡A¦ý¥Î³o¤èªkn¦³¦³¤Oªºª«¥óºÞ²z°µ«á¬Þ >©Ò¥H must ¬O³Ì²³æªº¤èªk > >
¤£½×¯à§_¸Ñ¨M§A»¡ªº PROTOTYPE_BASE_CRTP ¨º¨Ç°ÝÃD ¥¦»P must ³Ì®Ú¥»ªº®t§O¬O¡Amust ¦b³]p°ò¦Ãþ§Oªº®ÉÔ´N¥i¥H±j¨î§ï¼g ¦Ó¥¦¬O¦b¤lÃþ§OÄ~©Óªº®ÉÔ¥h¨Ï¥Î¹F¨ì±j¨î¤O¡A°ÝÃD´N¦b³o¸Ì¡A¦pªG»¡§A³£ ª¾¹Dn©I¥s³oÓ¥¨¶°¤F¡Aµ¥©ó§Aª¾¹D¥Ø«e³oÓÃþ§O¦³ÃB¥~ªº³d¥ô (§ï¼g clone »P accept) ³o¸ò must ªºªì°J¨Ã¤£¬Û²Å¡A©Ò¥H¨Ã¤£¯à¨ú¥N¥¦¡A¤£¹L¨Ï¥Î¥¦ÁÙ¬O¦³´£¿ô§@¥Î ¥¦µ¥©ó¬O¥ý¥ß¤@Ó tag¡A¦pªG§A¦³«Ü¦h¨ç¼Æn§ï¼g¡A¤£¥i¯à¤@¦¸¼g§¹¡A³oÓ¥¨¶°ÁÙ¬O¥i¥H±Ò¨ì´£¿ôªº§@¥Î¡C
|
|
|
2017/12/18 ¤U¤È 07:07:36
>cloneµ´¹ï¬Omust»Ýnªº¦n½d¨Ò¡A¦]¬°¦³ wiki I®Ñ: >§J¶©¡]^语¡GClone¡^¦b¼s¸q¤W¬O«ü§Q¥Î¥Íª«§Þ术¥ÑÆÓ©Ê¥Í´Þ产¥ÍÉOì个Ê^¦³§¹¥þ¬Û¦P°ò¦]组¤§¦Z¥Nªº过µ{¡C §A©Î§Ú³£¥i¥H¥h½swiki^^¡A¥B¤£ª§wikiªºÅv«Â©Ê¡C §AÂX¤j¸ÑÄÀ³o¥y¸Üªº·N«ä¡A¤]»~¸Ñ§Úªº·N«ä¡C§Ú±q¨S»¡clone¤£¥²½Æ»s§¹¥þ¬Û¦Pªºª«¥ó¡C ³o¥y¸Üªº·N¬O¡A½Æ»sªºµ²ªGn©M³Q½Æ»sªÌ§¹¥þ¬Û¦P¡A¦ýn¹F¦¨³o¥Øªº¡A¨S»¡«D±omust¤£¥i¡C ¦³must¡A¦ýµ{¦¡û¨ScloneªºÆ[©À©Îµ{¦¡¼g¿ù¡AÁÙ¬O¥i¯à½Æ»s¤@Ó¤£§¹¥þ¬Û¦Pªº¤À¨¡C mustY°µ¬°¤@ÓHint©ÎWarning«Ü¦n¡C¦ýÅܦ¨±j¨î´N¤£¦n¡C²z¥Ñ´N¬O§Ú«e±¤@ª½»¡ªº: OOP ©Î C++ªºª«¥ó¡A«üªº¬O¸ê®Æ(¥]¬AVtable)¡A¤£¬OÃþ§O¸Ì±ªº¨ç¦¡¡C ¦pªGÄ~©ÓÃþ§O¨Ã¨S¦³¼W¥[©Î§ïÅÜ¥ô¦ó¸ê®Æ¡A¤£ºÞ¬O¤÷©Î¤lclone³£¬O¥i¥H»s°µ¬Û¦Pªºª«¥ó¡A¨º¬°¦ó¤£¯à¥æµ¹¤÷Ãþ§Oclone´N¦n? ¦P¬O½Æ»s¥X¤@¼Ò¤@¼Ëªºª«¥ó¡I¥unµ{¦¡ûª¾¹D¦b°µ¤°»ò¡A¦³¦ó¤£¥i?
|
|
|
2017/12/18 ¤U¤È 07:11:44
> >¤£½×¯à§_¸Ñ¨M§A»¡ªº PROTOTYPE_BASE_CRTP ¨º¨Ç°ÝÃD >¥¦»P must ³Ì®Ú¥»ªº®t§O¬O¡Amust ¦b³]p°ò¦Ãþ§Oªº®ÉÔ´N¥i¥H±j¨î§ï¼g >¦Ó¥¦¬O¦b¤lÃþ§OÄ~©Óªº®ÉÔ¥h¨Ï¥Î¹F¨ì±j¨î¤O¡A°ÝÃD´N¦b³o¸Ì¡A¦pªG»¡§A³£ >ª¾¹Dn©I¥s³oÓ¥¨¶°¤F¡Aµ¥©ó§Aª¾¹D¥Ø«e³oÓÃþ§O¦³ÃB¥~ªº³d¥ô (§ï¼g clone »P accept) >³o¸ò must ªºªì°J¨Ã¤£¬Û²Å¡A©Ò¥H¨Ã¤£¯à¨ú¥N¥¦¡A¤£¹L¨Ï¥Î¥¦ÁÙ¬O¦³´£¿ô§@¥Î >¥¦µ¥©ó¬O¥ý¥ß¤@Ó tag¡A¦pªG§A¦³«Ü¦h¨ç¼Æn§ï¼g¡A¤£¥i¯à¤@¦¸¼g§¹¡A³oÓ¥¨¶°ÁÙ¬O¥i¥H±Ò¨ì´£¿ôªº§@¥Î¡C
¦]¨S¦³ must ¥i¥Î¡A©Ò¥H·Q»¡¨S³½½¼¤]¦n¡A¥un¯à¦³Ó´£¿ô»²§Uªº´N¦æ¤F
|
|
|
2017/12/18 ¤U¤È 09:31:48
>>cloneµ´¹ï¬Omust»Ýnªº¦n½d¨Ò¡A¦]¬°¦³ wiki I®Ñ: >>§J¶©¡]^语¡GClone¡^¦b¼s¸q¤W¬O«ü§Q¥Î¥Íª«§Þ术¥ÑÆÓ©Ê¥Í´Þ产¥ÍÉOì个Ê^¦³§¹¥þ¬Û¦P°ò¦]组¤§¦Z¥Nªº过µ{¡C >§A©Î§Ú³£¥i¥H¥h½swiki^^¡A¥B¤£ª§wikiªºÅv«Â©Ê¡C >§AÂX¤j¸ÑÄÀ³o¥y¸Üªº·N«ä¡A¤]»~¸Ñ§Úªº·N«ä¡C§Ú±q¨S»¡clone¤£¥²½Æ»s§¹¥þ¬Û¦Pªºª«¥ó¡C >³o¥y¸Üªº·N¬O¡A½Æ»sªºµ²ªGn©M³Q½Æ»sªÌ§¹¥þ¬Û¦P¡A¦ýn¹F¦¨³o¥Øªº¡A¨S»¡«D±omust¤£¥i¡C >¦³must¡A¦ýµ{¦¡û¨ScloneªºÆ[©À©Îµ{¦¡¼g¿ù¡AÁÙ¬O¥i¯à½Æ»s¤@Ó¤£§¹¥þ¬Û¦Pªº¤À¨¡C >mustY°µ¬°¤@ÓHint©ÎWarning«Ü¦n¡C¦ýÅܦ¨±j¨î´N¤£¦n¡C²z¥Ñ´N¬O§Ú«e±¤@ª½»¡ªº: >OOP ©Î C++ªºª«¥ó¡A«üªº¬O¸ê®Æ(¥]¬AVtable)¡A¤£¬OÃþ§O¸Ì±ªº¨ç¦¡¡C >¦pªGÄ~©ÓÃþ§O¨Ã¨S¦³¼W¥[©Î§ïÅÜ¥ô¦ó¸ê®Æ¡A¤£ºÞ¬O¤÷©Î¤lclone³£¬O¥i¥H»s°µ¬Û¦Pªºª«¥ó¡A¨º¬°¦ó¤£¯à¥æµ¹¤÷Ãþ§Oclone´N¦n? >¦P¬O½Æ»s¥X¤@¼Ò¤@¼Ëªºª«¥ó¡I¥unµ{¦¡ûª¾¹D¦b°µ¤°»ò¡A¦³¦ó¤£¥i?
¤¶±³]p±Ä¥Î Clone() ´Nn·Q¿ìªkÅý©w¸q½T¹ê¼i¦æ¡A³o¼Ëµ¹¨Ï¥ÎºÝ¤~ºâ¦³¥æ¥N¡Au´öÁФõ¦b©Ò¤£Ãã¡AY°µ¤£¨ì ´NÀ³¸Ó§â Clone() ®³±¼¡A³o¼Ë¤~¥st³d
©Ò¥H Clone() ¥u¯à¥Î»P¤£¥Î¡A¨S¦³§´¨óªº¾l¦a
|
|
|
2017/12/19 ¤U¤È 01:51:41
>¤¶±³]p±Ä¥Î Clone() ´Nn·Q¿ìªkÅý©w¸q½T¹ê¼i¦æ¡A³o¼Ëµ¹¨Ï¥ÎºÝ¤~ºâ¦³¥æ¥N¡Au´öÁФõ¦b©Ò¤£Ãã¡AY°µ¤£¨ì >´NÀ³¸Ó§â Clone() ®³±¼¡A³o¼Ë¤~¥st³d©Ò¥H Clone() ¥u¯à¥Î»P¤£¥Î¡A¨S¦³§´¨óªº¾l¦a "u´öÁФõ"¡A¦³³o»òÄY«¶Ü^^ ³o¥u¬O§Aªº¿ï¾Ü¡A´N§Ú¨Ó¬Ý¡A¥unl¥ÍÃþ§Oª«¥ó©M°òÃþ¬O¤@¼Ëªº¡A©I¥s°òÃþ§OªºClone¬O¨S°ÝÃDªº¡C ©Ò¥H¥HClonen»¡ªA§Úmustªº¥²n©Ê¡A§Ú«ÜÃø»{¦P¡C ¦ý¡A¯un´£¿ôl¥ÍÃþn¹ê§@¦Û¤vªºClone¡A¨ä¹ê¤£¥²¹³«e±¼gªº¨º»ò½ÆÂø(±µ¤âªº¤â¥ún¬ÝÀ´©M¨Ï¥Î´Nn¶O¤£¤Ö¤ß¤O)¡C ¹³³o¼Ë´N¥i¥H¤F: class Base { public: virtual Base *Clone() { assert(strcmp("class Base", typeid(*this).name())==0);//¦bdebug¶¥¬q¡AÀˬdl¥ÍÃþ§O¬O§_¹ê§@Clone return new Base(*this); } };
class Derived1 :public Base { public: virtual Base *Clone() { assert(strcmp("class Derived1",typeid(*this).name())==0);//¦bdebug¶¥¬q¡AÀˬdl¥ÍÃþ§O¬O§_¹ê§@Clone return new Derived1(*this); }
};
|
|
|
2017/12/19 ¤U¤È 07:15:24
¥i¦æ¡A°O¤j¥\¤@¥ó¡A¤£¹Ln§ï¤@¤U
#include <string.h> #include <assert.h>¡@¡@ /* assert */ #include <typeinfo>¡@¡@ /* assert */ #include <iostream>
using namespace std;
class Base { public: ¡@virtual Base *Clone() ¡@{ ¡@¡@Base *p = new Base(*this); ¡@¡@assert(strcmp(typeid(*p).name(), typeid(*this).name()) == 0);//¦bdebug¶¥¬q¡AÀˬdl¥ÍÃþ§O¬O§_¹ê§@Clone ¡@¡@return p; ¡@} };
class Derived1 :public Base { public: ¡@virtual Base *Clone() ¡@{ ¡@¡@Base *p = new Derived1(*this); ¡@¡@assert(strcmp(typeid(*p).name(), typeid(*this).name()) == 0);//¦bdebug¶¥¬q¡AÀˬdl¥ÍÃþ§O¬O§_¹ê§@Clone ¡@¡@return p; ¡@} };
int main() { ¡@Base *pBase = new Derived1; ¡@Base *pCloneBase = pBase->Clone();
¡@return 0; }
|
|
|
2017/12/19 ¤U¤È 07:29:25
¤£¹LÁÙ±o´£¿ô±µ¤âªÌ¨Ì¼Ëµe¸¬Äª¡AÁÙ¬O´£¨Ñ must ·|¤ñ¸û²³æ
|
|
|
2017/12/19 ¤U¤È 08:24:49
>¤£¹LÁÙ±o´£¿ô±µ¤âªÌ¨Ì¼Ëµe¸¬Äª¡AÁÙ¬O´£¨Ñ must ·|¤ñ¸û²³æ °ò¥»¤W¡C§Ú»{¬°¤£·|´£¨Ñ¡C²Ä¤@¡A¨S»Ýn©Ê¡A²Ä¤G¦³¹HÄ~©Óì«h¡C Ãö©ó²Ä¤GÂI¡Aì«h¬O¡A°òÃþ¥i¥H¨M©w¥»¨¬O§_¥i¶Ç¨ì¤U¥N¡A¦ý¤£À³¨î¤U¤@¥N¬O§_¤¹³\¶Çµ¹¤U¤U¤@¥N¡C (´Nºâ§A¤£¦P·N¤U¥N¥i¥H¤Þ¥Î°òÃþªºClone¡A¦ý¦pªG¤U¥N¦³¨ä¥¦ªºClone°µªk¡A¥i¥H¶Çµ¹¤U¤U¥N¤Þ¥Î©O?) ´NºâC++À³§An¨Dµ¹§Amust¦n¤F¡A¤U¥Nn¤£Å¥¸Ü¡A¼g¦¨³o¼Ë¡A§Aªºmust¤S¯à@¦ó?(¹³§Ú´N¥i¯à¤£Å¥¸Ü¡A¦]¬°§Ú»{¬°¥i¥H©µ¥Î°òÃþclone) class Derived1 :public Base { public: virtual Base *Clone() {return Base ::Clone();} };
¨Ï¥Îassert¤è¦¡¡A°£¤Fªí©ú¤£µ¹¤l¥NÄ~©Ó¨Ï¥Î¡A¤]¬O¤@ºØ´£¿ô¤U¥N¡A;Y¨S¦³¨ä¥¦·Qªk¡A´NÁÙ¬O§âassert¥[¤W¥h¡C Yì©l°òÃþ³]p¡A¬O´Á±æ(¤]¶È¯à´Á±æ)Clone³£¬O¤@¼Ëªº¼gªk¡A¨º¨Ï¥Î¦¨û¨ç¦¡¼Òª©µ¹l¥ÍÃþ§O¨Ï¥Î¡A¥iÁ×§Kº|¼gassert¡C ³o´N¯à¹F¨ì§Aªº¥Øªº¡C¦ýµ¸Âk¬O´Á±æ¡AµLªk±j¨î(³smust³£µLªk±j¨î)¡A¤l¥Nn¤£Å¥¸Ü¡A°µ¤÷¿Ëªº¤£n·Q¤Ó¦h¡A¥H¬°ºÞ±o¤F(¤£Å¥¸Ü¦³¨âºØ¡A¤@ºØ¬O¶Ã·d¡A¥t¤@ºØ¬O¦³¦Û¤vªº·Qªk)¡C ¥t¥~¤@Ó«ØÄ³¡AClone¼g¦¨³o¼Ë¡A¦b¨Ï¥Î®É¡AY¦³l¥ÍÃþ§O§Ñ¤F¦Û¤vªºClone¡A¦b½sͮɴN¥iÀ˪¾: class Base { public: virtual Base *Clone(){ return new Base(*this); } };
class Derived1 :public Base { public: virtual Derived1 *Clone(){ return new Derived1(*this);}
};
class Derived2 :public Base { //¨S¦³¹ê§@Clone };
int main() { Derived1 *pB1 = new Derived1; Derived2 *pB2 = new Derived2;
Derived1 *pC1 = pB1->Clone(); Derived2 *pC2 = pB2->Clone();//¦b½sͶ¥¬q´N¥iÀ˪¾Derived2¨S¦³¹ê§@Clone }
¨Ï¥ÎassertÀˬd¦A¥[¤Wcovariant return typesªºÀ°¦£¡A³Ì«á¥Îtemplate§âCloneªº¹ê§@¥]°_¨Ó¡AÀ³¸ÓÅ¥¸Üªº¤p«Ä«ÜÃø¥Xy¤F¡C ¦ý¤p«Än¤£Å¥¸Ü¡A¯«¥PÃø±Ï(must¤]¨S¥Î)¡C
|
|
|
2017/12/20 ¤W¤È 09:37:27
>int main() >{ > Derived1 *pB1 = new Derived1; > Derived2 *pB2 = new Derived2; > > Derived1 *pC1 = pB1->Clone(); > Derived2 *pC2 = pB2->Clone();//¦b½sͶ¥¬q´N¥iÀ˪¾Derived2¨S¦³¹ê§@Clone >}
¥Ñ©ó§A¥Îªk¤£·í¡A¾ÉPÆ[ÂI°¾®t¡A©Ò¥H´N¤@ª½¦b¦U»¡¦Uªk §AÀ³¸Ó¥Ñ Base ªº¨Ï¥Î¨¤«×¥h¦Ò¶q¡A¦Ó¤£¬O¥Ñ Derived
Base *Fun(Base *pBase) { return pBase->Clone(); }
> >¨Ï¥ÎassertÀˬd¦A¥[¤Wcovariant return typesªºÀ°¦£¡A³Ì«á¥Îtemplate§âCloneªº¹ê§@¥]°_¨Ó¡AÀ³¸ÓÅ¥¸Üªº¤p«Ä«ÜÃø¥Xy¤F¡C
ÀRºAÄ~©Ó§Ú¤]¥Î¦Ò¼{¹L¡A¤£¹L¨º©M PROTOTYPE_BASE_CRTP °µªkªº®ÄªG¬Û·í
>¦ý¤p«Än¤£Å¥¸Ü¡A¯«¥PÃø±Ï(must¤]¨S¥Î)¡C
assert ¥u¦b Clone() ®ÄªG¸û¦n¡AY¥Î¦b Visitor ªº Accept() ¤¤¤]n²£¥Í¤@ӥΤ£¨ì¥u§@¬° assert Àˬdªºª«¥ó¡A§A¬O§_¯à±µ¨ü
|
|
|
2017/12/20 ¤U¤È 01:59:02
> >>¦ý¤p«Än¤£Å¥¸Ü¡A¯«¥PÃø±Ï(must¤]¨S¥Î)¡C > >assert ¥u¦b Clone() ®ÄªG¸û¦n¡AY¥Î¦b Visitor ªº Accept() ¤¤¤]n²£¥Í¤@ӥΤ£¨ì¥u§@¬° assert Àˬdªºª«¥ó¡A§A¬O§_¯à±µ¨ü
¤£¶·²£¥Íª«¥ó¡A³o¼Ë¤]¥i¥H
assert(strcmp(typeid(Base).name(), typeid(*this).name()) == 0);//¦bdebug¶¥¬q¡AÀˬdl¥ÍÃþ§O¬O§_¹ê§@Clone
|
|
|
2017/12/20 ¤U¤È 04:36:46
>int main() >>{ >> Derived1 *pB1 = new Derived1; >> Derived2 *pB2 = new Derived2; >> >> Derived1 *pC1 = pB1->Clone(); >> Derived2 *pC2 = pB2->Clone();//¦b½sͶ¥¬q´N¥iÀ˪¾Derived2¨S¦³¹ê§@Clone >>} > >¥Ñ©ó§A¥Îªk¤£·í¡A¾ÉPÆ[ÂI°¾®t¡A©Ò¥H´N¤@ª½¦b¦U»¡¦Uªk >§AÀ³¸Ó¥Ñ Base ªº¨Ï¥Î¨¤«×¥h¦Ò¶q¡A¦Ó¤£¬O¥Ñ Derived ³o¥u¬O´£¨Ñ¤@Ó¥i¥H¦b½sͶ¥¬q¥i¥HÀ˪¾¦³¨S¦³¹ê§@Cloneªº¤èªk¡C Clone¨Ï¥Îcovariant return types¬O¼Ð·Çªº¥Îªk¡A PC2§A§â¥¦·í§@Base¨Ï¥Î¤]§¹¥þ¨S°ÝÃD¡CÃö¤°»ò¥Îªk¤£·í? ¦³Ãömust©MÂ૬ªº°Q½×°÷¦h¤F¡A§Ú´£¥X¤F«Ü¦h¦UÓ¨¤«×ªºÆ[ÂI(ÁÙ¦³¥¿¦¡¤å¥ó)¡A½Ð°Ý§A´£¥X¤F¤°»ò? ´Nª½±µ¤Uµ²½×¬O§O¤HªºÆ[ÂIüW®t? ¤Ï¥¿must¯u¥¿ªº»Ý¨D§Ú¬O·P¨ü¤£¨ì¡Aclone¤]¤£¬O¦nªF¦è(§Ú̳£¬O¥HlayerºÞ²z¶¥¼hª«¥ó«Ø¥ß©M¦æ¬°³\¥i)¡A¨ºÓassert¤]¬O«d¨¬¾A¼i¡C ¡A¬JµL¦@ÃÑ¡A°Q½×´N¨ì¦¹§a¡C
Base *Fun(Base *pBase) { return pBase->Clone(); }
|
|
|
2017/12/20 ¤U¤È 04:44:41
>>int main() >>>{ >>> Derived1 *pB1 = new Derived1; >>> Derived2 *pB2 = new Derived2; >>> >>> Derived1 *pC1 = pB1->Clone(); >>> Derived2 *pC2 = pB2->Clone();//¦b½sͶ¥¬q´N¥iÀ˪¾Derived2¨S¦³¹ê§@Clone >>>} >> >>¥Ñ©ó§A¥Îªk¤£·í¡A¾ÉPÆ[ÂI°¾®t¡A©Ò¥H´N¤@ª½¦b¦U»¡¦Uªk >>§AÀ³¸Ó¥Ñ Base ªº¨Ï¥Î¨¤«×¥h¦Ò¶q¡A¦Ó¤£¬O¥Ñ Derived >³o¥u¬O´£¨Ñ¤@Ó¥i¥H¦b½sͶ¥¬q¥i¥HÀ˪¾¦³¨S¦³¹ê§@Cloneªº¤èªk¡C >Clone¨Ï¥Îcovariant return types¬O¼Ð·Çªº¥Îªk¡A >PC2§A§â¥¦·í§@Base¨Ï¥Î¤]§¹¥þ¨S°ÝÃD¡CÃö¤°»ò¥Îªk¤£·í? >¦³Ãömust©MÂ૬ªº°Q½×°÷¦h¤F¡A§Ú´£¥X¤F«Ü¦h¦UÓ¨¤«×ªºÆ[ÂI(ÁÙ¦³¥¿¦¡¤å¥ó)¡A½Ð°Ý§A´£¥X¤F¤°»ò? >´Nª½±µ¤Uµ²½×¬O§O¤HªºÆ[ÂIüW®t? >¤Ï¥¿must¯u¥¿ªº»Ý¨D§Ú¬O·P¨ü¤£¨ì¡Aclone¤]¤£¬O¦nªF¦è(§Ú̳£¬O¥HlayerºÞ²z¶¥¼hª«¥ó«Ø¥ß©M¦æ¬°³\¥i)¡A¨ºÓassert¤]¬O«d¨¬¾A¼i¡C >¡A¬JµL¦@ÃÑ¡A°Q½×´N¨ì¦¹§a¡C > >Base *Fun(Base *pBase) >{ > return pBase->Clone(); >}
Clone() ¬O Prototype pattern ªº¥Dn¥\¯à¡A¥»¨Ó´N¬O¥Ñ Base ªº¨¤«×¨Ó³B²z¡A§A¥i¥H¥ý¥h¤F¸Ñ¤@¤U Prototype pattern
|
|
|
2017/12/20 ¤U¤È 10:08:16
>Clone() ¬O Prototype pattern ªº¥Dn¥\¯à¡A¥»¨Ó´N¬O¥Ñ Base ªº¨¤«×¨Ó³B²z¡A§A¥i¥H¥ý¥h¤F¸Ñ¤@¤U Prototype pattern ±qOO(P)¨ìÂ૬¡A³£ÀH«K¥áÓ¦Wµü¡AÅý§Ú©é©R¸Ñ»¡¡Cn§O¤HÀ°§AŪ®Ñ¡A¤]¤£¥Î¦Ñ¬O¨Ó³o¤@©Û¡A¦n¶Ü? covariant return type ±`¦bPrototype pattern¤@°_½Íªº¡Aclone return variant type ´N¤£¬OPrototype pattern¤F¶Ü? ¨º¤]¬O¼Ð·Ç¥Î¼gªk(¤§¤@) return base(interface)¡A¾Þ§@°ò¥»¤W¥þ¥Ñbase(interface)¶i¦æ¡A³o¬O¤ñ¸û²z·QªºPrototype pattern¡A§Úª¾¹D°Ú¡I «e±¤£¬O»¡¤F¶Ü¨Ï¥Îcovariant type¥Øªº¥u¦b©óÀ³§A¤£±¡¤§½Ð¡A¦hÓÀˬdDerived¬O§_¦³¹ê§@Clone¦Ó¤v¡C µ{¦¡n¥þ³¡¨Ï¥Îbase(interface)¥h¾Þ§@¡A¨S¤Hµ¹§A¨î¡C³o¹H¤Ï¤F¤°»ò Base ªº¨¤«×? ¤£n§A¦Û¤v§âBaseÂ૬¦^¨ÓDerived°µ¨Ò¤l¡A«ÜOK¡A§O¤HClone¦^¨ÓDerived´N§ì¨g¡C ¨âªÌ¥Øªº³£¬O¤@¼Ëªº¦bÀˬdl¥ÍÃþ§O¬O§_¦³¹ê§@clone¡A¥u¬O¤@Ó¬O°ÊºAÀˬd¡A¤@Ó¬OÀRºAÀˬd¡C ¦Ü©ó³oºØÀˬd¡A§Aıªº«Ü«n¡A§Úı±o¨S·N¸q¦Ó¤v¡C
|
|
|
2017/12/21 ¤W¤È 10:16:13
ÁÙ¬O¥h¬Ý¬Ý§a¡A§_«h¯Ê¥F·¾³q°ò¦¡A¤@ª½Âû¦PÀnÁ¿¦U»¡¦U¸Ü¤]¤£¬O¿ìªk
|
|
|
2017/12/22 ¤U¤È 07:13:29
¥Î¤@Ó½d¨Ò°µÓÁ`µ²¡A¤]·PÁ coco ´£¨Ñªº assert¡A¦b C++ ¨S¦³´£¨Ñ must ¤§¤U¡AÁٯవ¨ìÃþ¦üªº®ÄªG¡A Åýµ{¦¡Â²¼ä¤£¤Ö¡A¤]¥Ñ¦¹¬Ý¥X must ªº¶·n©Ê
½d¨Ò¥Dn®i¥Ü prototype pattern ¤Î visitor pattern ªº¬[ºc¡A¤£¹L visitor pattern °µ¤F§ï¨}¡A¥i¥H ±Ä¥Î ClassID °µ°t¹ï¡A¥i¥H¦b°õ¦æ®É´Á°µ¸û¾÷°Êªº³B²z¡A¦ý¬°¤F´î¤Ö½g´T©MÃø«×¡AÁÙ¬O¼g¦º¥¼°µ¸û¾÷°Êªº ³B²z
class C ¬O¬°¤Fªí²{¥¼±j¨î¹ê§@ªº«áªG¡A¦³´X³B°µ¤F remark¡A§â remark ªº¦a¤è«ì´_¡A´N¥i¥¿±`°õ¦æ
#include <map> #include <memory> #include <string> #include <assert.h>¡@¡@ /* assert */ #include <typeinfo>¡@¡@ /* assert */ #include <iostream>
using namespace std;
// ´¡¥óªºÃѧO½X #define Base_ClassID u8"14432A2FAECE4DA7A33CDA7472FB61DE" #define A_ClassID u8"9EED77B5BD97404B85A390E2806FE435" #define B_ClassID u8"11B5DCB493744F9B9A7C14343CF609A6" #define C_ClassID u8"20DB108E78284B8390D258A4626523AC"
class Visitor; class Base;
class Prototype { ¡@virtual Prototype *Clone() const = 0; public: };
class Acceptor { ¡@virtual string GetClassID() const = 0; public:
¡@virtual void Accept(Visitor *v) = 0;
¡@friend class Visitor; };
class Visitor { protected: ¡@string GetClassID(Acceptor *pAcceptor) const ¡@{ ¡@¡@return pAcceptor->GetClassID(); ¡@}
¡@virtual void Visit(Acceptor *pAcceptor) = 0; public: ¡@ ¡@friend class Base; };
class Base:public Prototype, public Acceptor { ¡@virtual string GetClassID() const override ¡@{ ¡@¡@// ¤£ã³\ Base ³QÄ~©Ó¡A«o¨S¦³Âмg GetClassID() ¡@¡@assert(strcmp(typeid(Base).name(), typeid(*this).name()) == 0); ¡@¡@return Base_ClassID; ¡@} ¡@virtual void Accept(Visitor *v) override final ¡@{ ¡@¡@v->Visit(this); ¡@}
public: ¡@virtual Base *Clone() const override ¡@{ ¡@¡@// ¤£ã³\ Base ¨S¦³³QÄ~©Ó¡AÁÙ°õ¦æ Clone() ¡@¡@assert(strcmp(typeid(Base).name(), typeid(*this).name()) != 0); ¡@¡@return new Base(*this); ¡@} };
|
|
|
2017/12/22 ¤U¤È 07:14:59
/***/ class CustomVisitor { public: ¡@virtual void Visit(Acceptor *pAcceptor) const = 0; };
class VisitorManager :public Visitor { ¡@map<string, shared_ptr<CustomVisitor> > m_CustomVisitorMap;
¡@virtual void Visit(Acceptor *pAcceptor) override ¡@{ ¡@¡@string ID = GetClassID(pAcceptor); ¡@¡@shared_ptr<CustomVisitor> CustomVisitor_Ptr = m_CustomVisitorMap[ID];
¡@¡@if (CustomVisitor_Ptr) ¡@¡@¡@CustomVisitor_Ptr->Visit(pAcceptor); ¡@¡@else ¡@¡@¡@cout << "ª«¥ó§ä¤£¨ì¬ÛÀ³ªº CustomVisitor" << endl; ¡@} public: ¡@VisitorManager(); };
class ObjPool { ¡@map<string, shared_ptr<Base> > m_BaseMap; public: ¡@ObjPool(); ¡@Base *Get(string ClassID) ¡@{ ¡@¡@shared_ptr<Base> Src = m_BaseMap[ClassID]; ¡@¡@if (Src) ¡@¡@¡@return Src->Clone(); ¡@¡@else ¡@¡@¡@return nullptr; ¡@} };
/***/ class BaseVisitor :public CustomVisitor { ¡@virtual void Visit(Acceptor *pAcceptor) const override ¡@{ ¡@¡@Base *pBase = static_cast<Base*>(pAcceptor); ¡@¡@cout << "Base ³Q Clone¡A½ÐÀˬd..." << endl; ¡@} public: };
class A :public Base { ¡@string m_Name{ "class A" };
¡@virtual string GetClassID() const override ¡@{ ¡@¡@// ¤£ã³\ A ³QÄ~©Ó¡A«o¨S¦³Âмg GetClassID() ¡@¡@assert(strcmp(typeid(A).name(), typeid(*this).name()) == 0); ¡@¡@return A_ClassID; ¡@} ¡@virtual A *Clone() const override ¡@{ ¡@¡@// ¤£ã³\ A ³QÄ~©Ó¡A«o¨S¦³Âмg Clone() ¡@¡@assert(strcmp(typeid(A).name(), typeid(*this).name()) == 0); ¡@¡@return new A(*this); ¡@}
public: ¡@void SayHI() ¡@{ ¡@¡@cout << "HI! My name is " << m_Name << endl; ¡@} };
class B :public Base { ¡@string m_Name{ "class B" };
¡@virtual string GetClassID() const override ¡@{ ¡@¡@// ¤£ã³\ B ³QÄ~©Ó¡A«o¨S¦³Âмg GetClassID() ¡@¡@assert(strcmp(typeid(B).name(), typeid(*this).name()) == 0); ¡@¡@return B_ClassID; ¡@} ¡@virtual B *Clone() const override ¡@{ ¡@¡@// ¤£ã³\ B ³QÄ~©Ó¡A«o¨S¦³Âмg Clone() ¡@¡@// assert(strcmp(typeid(B).name(), typeid(*this).name()) == 0); // remark ¡@¡@return new B(*this); ¡@}
public: ¡@void SayHello() ¡@{ ¡@¡@cout << "Hello! My name is " << m_Name << endl; ¡@} };
|
|
|
2017/12/22 ¤U¤È 07:16:48
class C :public B { ¡@int Age{ 100 };
¡@virtual string GetClassID() const override ¡@{ ¡@¡@// ¤£ã³\ C ³QÄ~©Ó¡A«o¨S¦³Âмg GetClassID() ¡@¡@assert(strcmp(typeid(C).name(), typeid(*this).name()) == 0); ¡@¡@return C_ClassID; ¡@}
// remark ¡@/* ¡@virtual C *Clone() const override ¡@{ ¡@¡@// ¤£ã³\ B ³QÄ~©Ó¡A«o¨S¦³Âмg Clone() ¡@¡@assert(strcmp(typeid(C).name(), typeid(*this).name()) == 0); ¡@¡@return new C(*this); ¡@} ¡@*/ public: ¡@void HowOld() ¡@{ ¡@¡@cout << "I am " << 50 << " years old" << endl; ¡@} };
class AVisitor :public CustomVisitor { ¡@virtual void Visit(Acceptor *pAcceptor) const override ¡@{¡@¡@ ¡@¡@// assert(strcmp(typeid(A).name(), typeid(*pAcceptor).name()) == 0);
¡@¡@A *pA = static_cast<A*>(pAcceptor); ¡@¡@pA->SayHI(); ¡@¡@cout << "A ½Æ»s¦¨¥\..." << endl; ¡@} public: };
class BVisitor :public CustomVisitor { ¡@virtual void Visit(Acceptor *pAcceptor) const override ¡@{ ¡@¡@// assert(strcmp(typeid(B).name(), typeid(*pAcceptor).name()) == 0);
¡@¡@B *pB = static_cast<B*>(pAcceptor); ¡@¡@pB->SayHello(); ¡@¡@cout << "B ½Æ»s¦¨¥\..." << endl; ¡@} public: };
class CVisitor :public CustomVisitor { ¡@virtual void Visit(Acceptor *pAcceptor) const override ¡@{ ¡@¡@// assert(strcmp(typeid(C).name(), typeid(*pAcceptor).name()) == 0);
¡@¡@C *pC = static_cast<C*>(pAcceptor); ¡@¡@pC->SayHello(); ¡@¡@pC->HowOld(); ¡@¡@cout << "C ½Æ»s¦¨¥\..." << endl; ¡@} public: };
|
|
|
2017/12/22 ¤U¤È 07:17:14
ObjPool::ObjPool() { ¡@// µù¥U©Ò¦³ Base ªº Derived ¡@m_BaseMap[string(Base_ClassID)] = shared_ptr<Base >(new Base); ¡@m_BaseMap[string(A_ClassID)] = shared_ptr<Base >(new A); ¡@m_BaseMap[string(B_ClassID)] = shared_ptr<Base >(new B); ¡@m_BaseMap[string(C_ClassID)] = shared_ptr<Base >(new C); }
VisitorManager::VisitorManager() { ¡@// µù¥U©Ò¦³ CustomVisitor ªº Derived ¡@m_CustomVisitorMap[string(Base_ClassID)] = shared_ptr<CustomVisitor >(new BaseVisitor);¡@ ¡@m_CustomVisitorMap[string(A_ClassID)] = shared_ptr<CustomVisitor >(new AVisitor); ¡@m_CustomVisitorMap[string(B_ClassID)] = shared_ptr<CustomVisitor >(new BVisitor); ¡@m_CustomVisitorMap[string(C_ClassID)] = shared_ptr<CustomVisitor >(new CVisitor); }
int main() { ¡@ObjPool MyObjPool; ¡@VisitorManager MyVisitorManager;¡@
¡@shared_ptr<Base> Obj_Ptr(MyObjPool.Get(string(A_ClassID))); ¡@shared_ptr<Acceptor> Acceptor_Ptr = static_pointer_cast<Acceptor>(Obj_Ptr); ¡@Acceptor_Ptr->Accept(&MyVisitorManager);
¡@cout << endl; ¡@Obj_Ptr = shared_ptr<Base>( MyObjPool.Get(string( C_ClassID )) ); ¡@Acceptor_Ptr = static_pointer_cast<Acceptor>(Obj_Ptr); ¡@Acceptor_Ptr->Accept(&MyVisitorManager);¡@
¡@return 0; }
|
|
|
|
|
|
|
|
|
|
ªO¥D :
simula
Top 10 µû»ù±Æ¦æ |
 |
C++ |
|
|
|
|
|
|
|
|
|
C++ |
 |
|
¡@ |
±M®aµ¥¯Å |
µû»ù |
¡@ |
¡@ |
¤@¥N©v®v |
10000 |
¡@ |
¡@ |
Ãm¥@©_¤~ |
5000 |
¡@ |
¡@ |
³»¦y°ª¤â |
3000 |
¡@ |
¡@ |
¨ô¶V±M®a |
1500 |
¡@ |
¡@ |
Àu¨q¦n¤â |
750 |
¡@ |
|
|
|
|
|
|
|
|
Microsoft Internet Explorer
6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 µ{¦¡³]pѼֳ¡ http://www.programmer-club.com.tw/ |
|
|