| ²é¿´: 245 | »Ø¸´: 1 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
sdlj8051½ð³æ (ÖøÃûдÊÖ)
|
[½»Á÷]
Óûã±àÀ´ÊµÏÖOOP
|
||
|
Óûã±àÀ´ÊµÏÖOOP OOPºÍÃæÏò¹ý³Ì¶¼ÊDZà³ÌÖеÄ˼Ï룬ÓÃѧÊõһЩµÄ»°ÊÇparadigm¡£Ôø¾ÓÐÈË˵¹ý£¬¼ÈÈ»cfrontÉú³ÉµÄÊÇC´úÂ룬ÄÇôÓÃC±¾ÉíÄËÖÁ»ã±à¶¼¿ÉÒÔʵÏÖOOP£¬Ö»ÊÇÌ«¶à¶«Î÷ÐèÒª×Ô¼ºÊÖ¹¤À´Íê³É¡£È·ÊµÊÇÕâÑùµÄ£¬ÃæÏò¹ý³ÌÔç¾ÍÓÃÔÚ»ã±àÉè¼ÆÖÐÁË£¬OOPÒ²Ôç¾ÍºÍ»ã±àÓÐÁ˽»»ãµã£¨95Äê֮ǰ£¬TASM¾ÍÒýÈëÁËOOPµÄ¸ÅÄ¡£Ö»ÊÇ»ã±àʵÏÖOOPÊÇûÓÐÐÎʽÉϵģ¬ÎÞ·¨ÌṩC++ÕâÑùµÄStrong-typedºÍÆäËû°²È«±£Ö¤£¨±ÈÈç´æÈ¡È¨ÏÞ£©¡£·â×°Ö»ÊÇÒ»ÖÖ¸ÅÄîÉϵģ¬×Ô¾õ×ñÊØµÄ¡£ OOPÓм¸¸ö¹Ø¼ü£¬¾ÝÎҵĴÖdzÀí½â¼´Îª£º·â×°ÐÔ£¬¼Ì³ÐÓë¶à̬¡£¾ßÌå±íÏÖ¾ÍÊǰÑÊý¾ÝºÍ²Ù×÷Êý¾ÝµÄº¯Êý·ÅÔÚÒ»Æð£¬Êý¾Ý·ÅÔÚ¶ÔÏóÖУ¬Ìṩ½Ó¿ÚʵÏÖ´æÈ¡¡£¼Ì³ÐÐÔʵÏÖÁËÓïÒå»òÕßʵÏֵļ̳У¬Í¬Ê±ÌåÏÖÔÚ¸ÅÄî²ã´ÎÓë´úÂëÖØÓÃÁ½¸ö·½Ãæ¡£¶à̬ÔòÊÇÀûÓÃÖ¸ÕëʵÏÖʹÓÃpointer»òreferenceÀ´ÊµÏÖͬһº¯ÊýÔÚ²»Í¬¼Ì³ÐÀàÖеĶà̬±íÏÖ¡£ OOPµÄ¶ÔÏóÄ£ÐÍÓкü¸ÖÖʵÏÖ·½Ê½£¬ÔÚ¡¶inside C++ object model¡·ÖÐÓм«ÆäÏ꾡µÄÐðÊö£º 1.Ö»°ÑÊý¾Ý·ÅÔÚ¶ÔÏóÖУ¬¶øÍ¨¹ýname mangling¼¼Êõ°Ñmember-functionÓëclass¹ØÁªÆðÀ´¡£ 2.µ¥±íÄ£ÐÍ£¬°Ñmember functionµÄpointer·ÅÈëµ½µ¥¶ÀµÄÒ»¸ö±í¸ñ£¬°Ñ±í¸ñµÄÈë¿ÚµØÖ··ÅÈë¶ÔÏóÖУ¨Ò»¸öÀà¶ÔÓ¦Ò»¸ö±í¸ñ£©¡£ÕâÔÚC++ÖбíÏÖΪVtblÓëVptr£¬ÕâÖÖÄ£ÐÍʵÏÖÁËÔËÐÐʱµÄ¶¯Ì¬Áé»îÐÔ£¬ËäÈ»¶àÁËÁ½´Îdereference¡£ 3.Ë«±íÄ£ÐÍ£¬°ÑÊý¾ÝÓ뺯Êý·ÖÁÐÔÚÁ½¸ö±í¸ñÖУ¬È»ºó°ÑÁ½¸ö±í¸ñµÄÈë¿ÚµØÖ·´æ·ÅÔÚ¶ÔÏóÖУ¬Ê¹µÃµ¥¸ö¶ÔÏóÓÐÁ˹̶¨µÄ´óС¡£ 4.¼òµ¥Ä£ÐÍ£¬Õâ¸öÊÇ»ã±àʵ×öµÄʱºòÓõÄÄ£ÐÍ¡£¾ÍÊǶÔÏóÖм´±£´æÁËÊý¾ÝÒ²±£´æÁ˺¯ÊýµØÖ·¡£ÎÞÂÛÊÇTASM»¹ÊÇMASM£¬¶¼ÊÇÕâô×öµÄ¡£ ´ÓЧÄÜÉÏÀ´Ëµ£¬C++µÄ×ö·¨ÊÇ×îÓŵġ£»ã±àʹÓõÚËÄÖÖÊÇÆÈ²»µÃÒÑ£¬ÊÇΪÁËʵÏֵļòµ¥ÐÔ¡£Ò»¶¨³Ì¶ÈÉÏÓë»ã±àµÄ¸ßЧµÄ¾«ÉñÎ¥±³¡£ TASMÒѾ²»³£ÓÃÁË£¬ÆäOOPµÄ×ö·¨ºÍMASMµÄ×ö·¨Ò²ÊÇÀàËÆµÄ¡£ÕâÀïÖ÷ÒªÌÖÂÛMASMµÄOOP×ö·¨¡£×÷ÕßÊÇNaN ºÍThomas Bleeker¡£ÆäʵÏֵİ취ÊÇÓú궨ÒåÀ´´ïµ½±¾À´Ó¦¸ÃÊDZàÒëÆ÷×öµÄÄ»ºó¹¤×÷¡£ÆäÖеĺêµÄ¼¼Çɺܶࡣµ«ÊÇ×îÖÕµÄʹÓÃÊÇͦ¼òµ¥µÄ¡£ºêµÄ¶¨Òå·ÅÔÚÒ»¸öOBJECTS.INCµÄÎļþÖУ¬asmÎļþ°üº¬Õâ¸öinc¾ÍÄÜʹÓÃÕâ¸öobject model¡£ ËäÈ»ºê×öµÃºÜ¾«ÇÉ£¬µ«ÊDZϾ¹MASMȱÉÙÖ§³ÖOOPµÄÓï·¨ÌØÐÔ£¬ÔÚʹÓÃµÄºÜ¶à·½Ãæ¶¼ÓÐÂé·³»òÕßÔÚ¿Õ¼äʱ¼äÉÏÓдú¼Û¡£±ÈÈ縲¸Ç»ùÀàµÄÐ麯Êý±ØÐëÿ´ÎÊÖ¹¤µÄÍê³É¡£Ò²¾ÍÊǼ̳еIJã´ÎÖÐËùÓи¸ÀàÒÔÉϵı»¸²¸ÇµÄÐ麯Êý¶¼ÐèÒªÔÚ×ÓÀàÖÐÊÖ¹¤Íê³É¡£ËäÈ»ÊÇÓÐÕâÑùÄÇÑùµÄȱµã£¬µ«ÊÇOOP»¹ÊǸø»ã±à´øÀ´Á˲»Éٺô¦¡£±ÈÈ磺 1.»ã±à¸üºÃµÄºÍCOM£¬C++ÕâÑùµÄÃæÏò¶ÔÏóÁìÓòµÄ¶«Î÷»¥¶¯¡£ÒѾÓÐÓûã±à£«OOPµ÷ÓÃcomµÄÀý×Ó¡£Èç¹ûÓûã±à£«OOPÀ´Ð´com½«¿ÉÒÔ²úÉúÊʺϸßËٶȺÍС³ß´çµÄ×é¼þ¡£ 2.À©´óÁË»ã±àÄܹ»½â¾öµÄÎÊÌⷶΧ£¬Ê¹µÃ»ã±à³ÌÐò¸ü¼ÓÈÝÒ×¹ÜÀíºÍºÏ×÷±àд¡£Õâ¸öobject modelµÄ×÷Õß¾ÍÓûã±à£«OOPдÁËÒ»¸ö»ùÓÚÉñ¾ÍøÂçµÄÊÖд×Öĸʶ±ðµÄ³ÌÐò£¬²»µ½200k£¨ÆäÖд󲿷ÖÊÇͼÏóÎļþÕ¼ÓõĿռ䣩¡£ -------------------------------------------------------------------------------- ʹÓà ¶¨ÒåÒ»¸ö»ùÀàµÄ°ì·¨¡£ ;×¼±¸ºÃº¯ÊýÔÐÍ Shape_Init PROTO WORDShap_destructorPto TYPEDEF PROTO WORD Shap_getAreaPto TYPEDEF PROTO WORDShap_setColorPto TYPEDEF PROTO WORD, WORD-------------------------------------------------------------------------------- ;ʵ¼ÊÉϾÍÊÇSTRUCµÄ¶¨Òå CLASS Shape, Shap CMETHOD destructor CMETHOD getArea CMETHOD setColor Color dd ? Shape ENDS -------------------------------------------------------------------------------- .data ;³õʼ»¯ BEGIN_INIT dd offset Shap_destructor_Funct dd offset Shap_getArea_Funct dd offset Shap_setColor_Funct dd NULL END_INIT -------------------------------------------------------------------------------- .code Shape_Init PROC uses edi esi lpTHIS WORD;ʵ¼Êµ÷Óóõʼ»¯ SET_CLASS Shape ;°Ñedi assmue ΪShapeÀàÐÍ SetObject edi, Shape ;¶îÍⶨÒåµÄDPrintºê£¬²»ÓÃϸ¾¿ DPrint "Shape Created (Code in Shape.asm)" ;È¡Ïûassmue ReleaseObject edi ret Shape_Init ENDP Shap_destructor_Funct PROC uses edi lpTHIS WORD SetObject edi, Shape DPrint "Shape Destroyed (Code in Shape.asm)" ReleaseObject edi ret Shap_destructor_Funct ENDP Shap_setColor_Funct PROC uses edi lpTHIS WORD, DATA WORDSetObject edi, Shape mov eax, DATA mov [edi].Color, eax DPrint "Shape Color Set!! (Code in Shape.asm)" ReleaseObject edi ret Shap_setColor_Funct ENDP Shap_getArea_Funct PROC uses edi lpTHIS WORDSetObject edi, Shape DPrint " " DPrint " SuperClassing!!!!! This allows code re-use if you use this method!!" DPrint " Shape's getArea Method! (Code in Shape.asm)" mov eax, [edi].Color DPrint " Called from Shape.getArea, (Code in Shape.asm)" DPrintValH eax, " This objects color val is" DPrint " " ReleaseObject edi ret Shap_getArea_Funct ENDP ¼Ì³ÐÕâ¸öÀà include Shape.asm ; Inherited class info file Circle_Init PROTO WORDCirc_destructorPto TYPEDEF PROTO WORD Circ_setRadiusPto TYPEDEF PROTO WORD, WORDCirc_getAreaPto TYPEDEF PROTO WORD-------------------------------------------------------------------------------- CLASS Circle, Circ ;¼Ì³ÐÔÓеÄÊý¾ÝºÍº¯Êý Shape <> ; Inherited Class CMETHOD setRadius Radius dd ? Circle ENDS -------------------------------------------------------------------------------- .data BEGIN_INIT dd offset Circ_destructor_Funct dd offset Circ_setRadius_Funct dd NULL END_INIT -------------------------------------------------------------------------------- .code Circle_Init PROC uses edi esi lpTHIS WORD;³õʼ»¯²¢ÊµÏּ̳РSET_CLASS Circle INHERITS Shape SetObject edi, Circle ;Ï൱ÓÚ¹¹Ô캯ÊýÖØÖÃvptr OVERRIDE getArea, CirleAreaProc DPrint "Circle Created (Code in Circle.asm)" ReleaseObject edi ret Circle_Init ENDP Circ_destructor_Funct PROC uses edi lpTHIS WORD SetObject edi, Circle DPrint "Circle Destroyed (Code in Circle.asm)" ;ʵÏÖÁË»ùÀຯÊýµÄµ÷Óà SUPER destructor ReleaseObject edi ret Circ_destructor_Funct ENDP Circ_setRadius_Funct PROC uses edi lpTHIS WORD, DATA WORDSetObject edi, Circle mov eax, DATA mov [edi].Radius, eax DPrint "Circle Radius Set (Code in Circle.asm)" ReleaseObject edi ret Circ_setRadius_Funct ENDP CirleAreaProc PROC uses edi lpTHIS WORDLOCAL TEMP SetObject edi, Circle SUPER getArea mov eax, [edi].Radius mov TEMP, eax finit fild TEMP fimul TEMP fldpi fmul fistp TEMP mov eax, TEMP DPrint "Circle Area (integer Rounded) (Code in Circle.asm)" ReleaseObject edi ret CirleAreaProc ENDP ¸ù¾ÝÀàÀ´Éú³É¶ÔÏ󣬲¢Ê¹Óà DEBUGC equ 1 .586 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\masm32.lib include Dmacros.inc include Objects.inc include Circle.asm .data .data? hCircle dd ? .code start: ; Recuse all inherited constructors.. and do all inits DPrint " " DPrint " >>> main.asm <<< [ mov hCircle, $NEW( Circle ) ]" mov hCircle, $NEW( Circle ) DPrint " " DPrint " >>> main.asm <<< [ METHOD hCircle, Circle, setColor, 7 ]" METHOD hCircle, Circle, setColor, 7 DPrint " " DPrint " >>> main.asm <<< [ METHOD hCircle, Circle, setRadius, 2 ]" METHOD hCircle, Circle, setRadius, 2 DPrint " " DPrint " ------------ TEST POLYMORPHIC METHOD hCircle.getArea ------------- " DPrint " " DPrint " >>> main.asm <<< [ DPrintValD $EAX( hCircle, Circle, getArea ) , 'Area of hCircle' ]" DPrintValD $EAX( hCircle, Circle, getArea ) , "Area of hCircle" DPrint " " DPrint " ------------ TEST POLYMORPHIC METHOD hCircle.getArea ------------- " DPrint " " DPrint " >>> main.asm <<< [ DPrintValD $EAX( hCircle, Shape, getArea ) , 'Area of hCircle' ]" DPrint " Typing calling this Ojbect Instance as a SHAPE type only! This is the true value" DPrint " of Polymorphism. We dont need to know its a Circle object in order to get the" DPrint " proper area of this instance object, that is inherited from Shape." DPrint " " DPrintValD $EAX( hCircle, Shape, getArea ) , "Area of hCircle" DPrint " " DPrint " " DPrint " >>> main.asm <<< [ DESTROY hCircle ]" DESTROY hCircle DPrint " " DPrint " " DPrint " NOTE: superclassing here, as each destructor call's the SUPER destructor" DPrint " To properly clean up after each class. To see SUPER classing in" DPrint " in the Polymorphic getArea Function. Uncomment the SUPER code in" DPrint " CircleAreaProc, and re-compile" call ExitProcess end start ¿´ÆðÀ´Í¦ÔÓÂҵ쬯äʵ»¹ÊÇͦÕûÆëµÄ¡£ÓÉËIJ¿·Ö×é³É¡£ µÚÒ»²¿·ÖÊǸ÷¸ö³ÉÔ±º¯ÊýµÄÉùÃ÷¡£ÌرðµÄÒ»¶¨ÒªÓÐÒ»¸ö¡°ÀàÃû_Init¡±µÄº¯Êý£¬Õâ¸öº¯ÊýÊÇÀàµÄ¹¹Ô캯Êý£¬Ãû×Ö¾ÍÊÇÕâ¸ö£¬²»Äܸ͝¡£ µÚ¶þ²¿·ÖÊÇÓÉclassÒýµ¼µÄº¯ÊýÉùÃ÷£¬Æäʵ¾ÍÊǶ¨Ò»¸öSTRUC£¬Ò²¾ÍÊǽṹÌå¡£ÆäÖÐͨ¹ýÄÚº¬»ùÀàµÄ¶¨ÒåÀ´´ïµ½½á¹¹Éϵļ̳С££¨Êý¾ÝÉϵļ̳ÐÔÚ¹¹Ô캯ÊýÖе÷ÓÃSET_CLASSÍê³É£©¡£ µÚÈý²¿·ÖÊÇ·ÅÔÚ.dataÖеijõʼ»¯ÐòÁУ¨BEGIN_INIT,END_INIT£©¡£Ï൱ÓÚC++µÄvtbl£¬µ«ÓÖ°üÀ¨Á˶ÔÏóµÄÊý¾Ý³ÉÔ±µÄ³õʼֵ¡£ µÚËIJ¿·ÖÊǸ÷¸ö³ÉÔ±º¯ÊýµÄʵÏÖ¡£ÌرðµÄÊǹ¹Ô캯ÊýÖÐÒªµ÷ÓõÄSET_CLASSºÍÓпÉÄܵ÷ÓõÄOVERRIDE£¬Íê³ÉÁËÊý¾ÝµÄ¼Ì³ÐºÍÐ麯ÊýµÄ¸Äд¡£ ʵ¼ÊʹÓÃÖвο¼Ò»Ð©ÒѾÓеÄÀý×ӾͿÉÒÔÂùÊæ³©µÄʹÓÃÁË¡£È·Êµ¿ÉÒÔ´øÀ´ºÜ´óµÄ·½±ã¡£ -------------------------------------------------------------------------------- ÔÀí ËùÓеİÂÃØ¶¼ÔÚObject.incÖУ¬ÆäÖж¨ÒåÁËÈçϵĺê ; --=====================================================================================-- ; MACRO LIST INDEX: ; --=====================================================================================-- ; NEWOBJECT ´´½¨ÐµĶÔÏóʵÌå ; METHOD µ÷ÓÃʵÌåÖеĺ¯Êý ; DESTROY destroy ¶ÔÏó (MUST) ; SetObject °Ñ¼Ä´æÆ÷ÖеÄÖ¸Õë¡°ÈÏΪ¡±Ä³ÖֽṹµÄÖ¸Õë ; ReleaseObject È¡ÏûÕâÖÖ¡°ÈÏΪ¡± ; OVERRIDE ¸Äд±í¸ñÖк¯ÊýµÄµØÖ·£¬ÊµÏÖ¶à̬ ; SET_CLASS ʵÏÖ³õʼ»¯£¬ÈçÓбØÒªÊµÏּ̳Р(MUST) ; SUPER µ÷ÓûùÀຯÊýµÄÖ§³Ö ; ; $EAX() Accelerated METHOD, returns in eax ; $EBX() Accelerated METHOD, returns in ebx ; $ESI() Accelerated METHOD, returns in esi ; $EDI() Accelerated METHOD, returns in edi ; $NEW() Accelerated NEWOBJECT, returns in eax ; $SUPER() Accelerated SUPER, returns in eax ; $DESTROY() Accelerated DESTROY, returns in eax ; $invoke() Accelerated invoke, returns in eax ; ; BEGIN_INIT ÔÚÊý¾Ý¶ÎÖбê¼Ç³õʼ»¯µÄÐÅÏ¢ (MUST) ; END_INIT ±íÃ÷±ê¼Ç½áÊø (MUST) ; ; CLASS ¼´ÎªSTRUCT (MUST) ; SET_INTERFACE To Declair Abbreviated Interface and Abv Name (MUST) ; CMETHOD ÉùÃ÷Àà»òÕß½Ó¿ÚÖеĺ¯Êý ; ; --=====================================================================================-- [ Last edited by »ÃÓ°ÎÞºÛ on 2006-10-17 at 09:02 ] |
» ²ÂÄãϲ»¶
»¯¹¤×¨Ë¶Çóµ÷¼Á
ÒѾÓÐ3È˻ظ´
274Çóµ÷¼Á
ÒѾÓÐ5È˻ظ´
µ÷¼Á
ÒѾÓÐ3È˻ظ´
08¹¤Ñ§µ÷¼Á
ÒѾÓÐ15È˻ظ´
ÕÐ08¿¼Êýѧ
ÒѾÓÐ16È˻ظ´
340Çóµ÷¼Á
ÒѾÓÐ3È˻ظ´
²ÄÁÏר˶ÕÒµ÷¼Á
ÒѾÓÐ4È˻ظ´
0854µç×ÓÐÅÏ¢Çóµ÷¼Á
ÒѾÓÐ6È˻ظ´
0805 316Çóµ÷¼Á
ÒѾÓÐ4È˻ظ´
0854 ¿¼Ñе÷¼Á ÕÐÉúÁË£¡AI ·½Ïò
ÒѾÓÐ17È˻ظ´
sdlj8051
½ð³æ (ÖøÃûдÊÖ)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ¹ó±ö: 0.1
- ½ð±Ò: 1149.8
- ºì»¨: 3
- Ìû×Ó: 2254
- ÔÚÏß: 18.1Сʱ
- ³æºÅ: 71297
- ×¢²á: 2005-05-30
- רҵ: µç·Óëϵͳ
|
ºêµÄÊýÁ¿Ò²²»ÊǺܶ࣬µ«ÊǵÄÈ·Íê³ÉÁ˱àÒëÆ÷ΪÎÒÃÇÍê³ÉµÄÄ»ºó¹¤×÷¡£ÎÒÖ»ÁгöºêÕ¹¿ªÇ°ºóµÄ´úÂ룬²¢¼ÓÒÔ½âÊÍ¡£¶ÔÓÚºêµÄ¾ßÌåʵÏÖÓÉÓÚÇ£Éæµ½Öî¶àÓï·¨ºÍ¼¼ÇÉ£¬²»·½±ãÏêϸ½²½â£¨ÆäʵÎÒÒ²ÊǸոÕͨ¹ý²éÊֲᣬһµãµã¶Á¶®µÄ£©¡£ ÏÈÀ´¿´CLASS°É£¬Õâ¸öÊÇÏ뵱ȻµÄÈë¿Ú²¿·Ö¡£ ÆäʵºÜ¼òµ¥¾ÍÊǰÑClass»»³ÉSTRUC¡£ CLASS Shape, Shap CMETHOD destructor CMETHOD getArea CMETHOD setColor Color dd ? Shape ENDS Ìæ»»Ö®ºó¾ÍÊÇ Shape STRUC CMETHOD destructor CMETHOD getArea CMETHOD setColor Color dd ? Shape ENDS ºÜ×ÔÈ»£¬¿´¿´CMETHODÊÇÔõô×öµÄ CMETHOD destructor ¾Í±ä³ÉÁË destructor PTR Circ_destructorPto ? Õû¸ö¾ÍÕ¹¿ªÎª£º Shape STRUC destructor PTR Circ_destructorPto ? getArea PTR Circ_getAreaPto ? setColor PTR Circ_setColor ? Color dd ? Shape ENDS ^_^£¬½á¹¹ÌåÖоÍÊǺ¯ÊýÖ¸ÕëºÍÊý¾ÝÂȻºó£¬ÏßË÷¾Í¶ÏÁË¡£¹âÕâÑù¶¨ÒåÒ»¸ö½á¹¹Êǿ϶¨²»Ðеġ£ÄÇô¾Í´Ó¶ÔÏóµÄ²úÉú¿ªÊ¼°É£¬newÊÇÔõô×öµÄ¡£ NEWOBJECT Circle --> invoke GetProcessHeap invoke HeapAlloc, eax, NULL, SIZEOF Circle push eax invoke Circle_Init, eax pop eax ÕâÀïÏÔʾÁËÒ»¸öºÜÃ÷ÏÔµÄȱÏÝ£¬¾ÍÊÇÒ»¶¨ÒªÔÚwin32ÏÂʹÓã¬ÒòΪwin32apiµÄʹÓ᣿ÉÒÔ°ÑapiÌæ»»³ÉÒ»¸öÍⲿµÄº¯Êý¡£È»ºó·ÅÔÚ²»Í¬µÄƽ̨ÉÏʹÓÃÖ»Òª¸Ä±äÕâ¸ö¶¯Ì¬·ÖÅäÄÚ´æµÄº¯Êý¾Í¿ÉÒÔÁË¡£ ²úÉúµÄ´úÂëºÜÆÓʵ£¬¾ÍÊÇ·ÖÅäÄڴ棬Ȼºóµ÷ÓöÔÏóµÄ¹¹Ô캯Êý¡£ÕâÀï£¬Ç¿ÖÆµÄÒªÇóÀàµÄ¹¹Ô캯ÊýÒªÒÔ¡°ÀàÃû_Init¡±µÄÐÎʽ¡£ËäÈ»²»ÊÇʲô´óµÄÏÞÖÆ£¬µ«ÊÇÒ²²»ÊǺÜˬ¡£ÕâÑù×öÒ²ÊÇÓеÀÀíµÄ£¬Í¨¹ýÔÚ±àдÉ϶ԽÓÉÏÃû×Ö¿ÉÒÔ±ÜÃâÓÃÖ¸ÕëÕâÑùµÄ¶«Î÷À´ÊµÏÖÁé»îÐÔËù´øÀ´µÄoverhead£¬ÏÂÃæ¿ÉÒÔ¿´µ½Îö¹¹º¯ÊýÓÃÁËÖ¸ÕëµÄÐÎʽ£¬ÕâÊÇÒòΪÕâÀïĬÈÏÁËvirtual desturctor¡£ ºÃ£¬ÏÂÃæÇ°½øµ½¹¹Ô캯Êý£¬ÎÒÃÇ¿´¹¹Ô캯ÊýÊÇÔõôдµÄ£º Shape_Init PROC uses edi esi lpTHIS WORDSET_CLASS Shape SetObject edi, Shape DPrint "Shape Created (Code in Shape.asm)" ReleaseObject edi ret Shape_Init ENDP lpTHISÓ¦¸Ã²»»áİÉú£¬¾ÍÊÇÖ¸Ïò¶ÔÏóµÄÖ¸Õë¡£ÕâÀïÒ»¸ö¶ÔÏóÒ²¾ÍÊÇÒ»¸östurctÀ²¡£µÚÒ»ÐоÍÊǹؼüËùÔÚ£¬SET_CLASSÊÇ×îÂé·³ºÍ¸»Óм¼ÇɵÄÒ»¸öºê¡£ÎÒÃÇÀ´¿´¿´ÊÇÔõô×öµÄ SET_CLASS Shape --> push esi push edi cld mov esi, offset @InitValLabel mov edi, lpTHIS mov ecx, @InitValSizeLabel shr ecx, 2 rep movsd mov ecx, @InitValSizeLabel and ecx, 3 rep movsb pop edi pop esi pushºÍpopÊÇºÜÆÕͨµÄ±£´æÏÖ³¡µÄ×ö·¨¡£¶ømov esi, offset @InitValLabelÔòÊǺͺóÃæµÄBEGIN_INITÓйء£offset @InitValLabelÒ²¾ÍÊÇBEGIN_INITËù±ê¼ÇµÄµØÖ·¡£ÕâÒ»¶Î³ÌÐòÆäʵûÓÐ×öÊ²Ã´ÌØ±ðµÄÊÂÇé¡£Ò²¾ÍÊǰÑBEGIN_INITºÍEND_INITÖ®¼äµÄ³õʼ»¯µÄÊý¾Ý¸³¸ø¸Õ¸Õnew³öÀ´µÄ¶ÔÏó¡£lpTHIS¾ÍÊÇÕâ¸ö¶ÔÏóµÄµØÖ·¡£ÓÉÓÚSET_CLASS×ÜÊǼٶ¨ÄãÔÚ¹¹Ô캯ÊýÖе÷ÓÃËü£¬ËùÒÔlpTHISµ±È»ÊÇ´æÔڵģ¨×÷Ϊ¹¹Ô캯ÊýµÄ²ÎÊý£©¡£cld, rep movvsd µÈ¶¼ÊÇ»ã±àµÄ¿ìËÙ°áÒÆÊý¾ÝµÄ¼¼ÇÉ¡£²éÒ»ÏÂÊÖ²á¾ÍÖªµÀÊǸÉʲôµÄÁË¡£Ò²¾ÍÊÇÒ»¿ªÊ¼¾¡Á¿Ò»¸ödwordÒ»¸ödwordµÄ°áÒÆ£¬È»ºó¾ÍÒ»¸öbyteÒ»¸öbyteµÄÒÆ£¬Ö±µ½È«²¿¶¼°á¹ýÈ¥ÁË¡£ Èç¹û´øÉÏÁ˼̳У¬ÔòÒªÂé·³Ðí¶à SET_CLASS Circle INHERITS Shape --> push esi push edi cld mov edi, lpTHIS mov esi, offset @InitValLabel mov eax, [esi] mov [edi], eax add esi, 4 add edi, Inher mov ecx, (@InitValSizeLabel - 4) shr ecx, 2 rep movsd mov ecx, (@InitValSizeLabel - 4) and ecx, 3 rep movsb pop edi pop esi ÓÉÓڼ̳ÐÁË£¬ËùÒÔÒªÖØÖÃÎö¹¹º¯Êý¡£mov eax, [esi]ºÍmov [edi], eax×öÁËÕâÑùµÄ¹¤×÷¡£¶øÓÉÓÚÎö¹¹º¯ÊýµÄµØÖ·ÒѾ¸Ä±äÁË£¬ËùÒÔÖ»ÐèÒªÒ²Ö»Äܼ̳кóÃæµÄÊý¾Ý³ÉÔ±°üÀ¨Ð麯ÊýµÄÖ¸Õë ½ÓÏÂÀ´ÊǶÔÏóµÄdestroy DESTROY hCircle --> mov eax, hCircle push eax call dword ptr [hCircle] push eax invoke GetProcessHeap invoke HeapFree, eax, NULL, hCircle pop eax ÓÉÓÚÎö¹¹º¯ÊýµÄµØÖ·ÊǶÔÏ󣨽ṹÌ壩µÄµÚÒ»¸ö³ÉÔ±£¬ËùÒÔcall¾ÍÊǵ÷ÓÃÎö¹¹º¯Êý¡£µ÷ÓÃÁËÖ®ºó¾ÍÓÃwin32api°ÑÉêÇëµÄÄÚ´æÊͷŵô ½ÓÏÂÀ´ÊÇÎö¹¹º¯Êý Circ_destructor_Funct PROC uses edi lpTHIS WORD SetObject edi, Circle DPrint "Circle Destroyed (Code in Circle.asm)" SUPER destructor ReleaseObject edi ret Circ_destructor_Funct ENDP Õâ¸öÊÇshapeµÄ¼Ì³ÐÀàcircleµÄÎö¹¹º¯Êý¡£ÀïÃæÓÐÒ»¸öSUPER£¬ÊµÏÖÁ˵÷ÓûùÀàÖеĺ¯Êý¡£ÎÒÃÇÀ´¼ÌÐø¿´ËüµÄʵÏÖ¡£ SUPER destructor --> invoke Circ_destructorPto PTR [ (INHER_initdata+INHER.MethodName) ], lpTHIS Circ_destructorPtoÖ¸¶¨Õâ¸öµØÖ·µÄÀàÐÍÊÇÒ»¸öʲôÑùµÄº¯Êý¡£INHERÊǺêÄÚ²¿µÄÒ»¸öÈ«¾ÖµÄ¶«Î÷£¬±íʾ¸ÃÀàµÄ»ùÀàÃû³Æ¡£INHER_initdata+INHER.MethodNameµÄ½á¹¹¾ÍÊÇÕâ¸öÀàÔÚ»ùÀàÖеÄʵ¼ÊµØÖ·¡£ ʣϵľÍÊÇʵ¼ÊµÄʹÓöÔÏóÖеĺ¯ÊýÁË£¨ÄãÊÇ¡°ÎÞȨ¡±²Ù×÷¶ÔÏóÖеÄÊý¾ÝµÄ£¬ËäÈ»ÊǸÅÄîÉϵġ£Êµ¼ÊÉÏÄã¿ÉÒÔËÁÒâµÄÆÆ»µÕâÀïÌåÏÖµÄOOP˼Ïë¡£ÒòΪ»ã±à²»ÌṩÕâÑùµÄ±£»¤£©¡£ METHOD hCircle, Shape, getArea --> mov edx, hCircle invoke (Shape PTR [edx]).getArea, edx ÊÕ»ñµÄ¼¾½ÚÁË¡£ÕâÒ»¾äÌåÏÖÁ˶à̬µÄ˼Ïë¡£hCircleÖ¸ÏòµÄÊÇÒ»¸öCircleÀàµÄ¶ÔÏ󣬵«Êǵ÷ÓõÄʱºò½âÊÍΪShapeÀà¡£×Ô¼ºÈ¥Àí½â°É¡£ÄÄÀïÌåÏÖÁ˶à̬¡£ -------------------------------------------------------------------------------- ÎҵĿ´·¨ ´ÓÈ«¾ÖÀ´¿´Õâ¸ö¶ÔÏóÄ£ÐÍ£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖÊÇÕâÑùµÄ¡£ ¶ÔÏóÊý¾ÝºÍÐ麯ÊýÖ¸Õë·ÅÔÚͬһ¸ö±í¸ñÖÐ ËùÓеĺ¯Êý¶¼ÊÇÐéµÄ ¼Ì³ÐÀà¸Äд»ùÀàµÄÐ麯ÊýÐèÒªÔÚ³õʼ»¯Êý¾ÝÖ®ºóÊÖ¹¤Íê³É£¨¹¹Ô캯ÊýÖУ© ½öÌṩ¶ÔÉÏÒ»²ã»ùÀàÖб»¸ÄдµÄÐ麯ÊýµÄ·ÃÎÊ ÄÚ´æµÄ·ÖÅäºÍÊÍ·ÅʹÓÃwin32api OOPµÄÈý¸öÌØÐÔµÄÖ§³Ö£¬ÈçÏ ·â×°ÐÔ£º²¢Ã»ÓÐÌṩ¶ÔÓÚÆäÖÐÊý¾ÝµÄÌØ±ð±£»¤£¨Ã»ÓÐPrivate£©¡£Êý¾ÝºÍº¯ÊýÖ¸ÕëÖÃÓÚͬһ¸ö½á¹¹ÌåÖгÉΪһ¸ö¶ÔÏó¡£·ÃÎÊÊý¾Ýͨ¹ýÌṩµÄ½Ó¿ÚÍêÈ«¿¿×Ô¾õ¡£ ¼Ì³Ð£ºÍ¨¹ý½á¹¹Ì嶨ÒåµÄǶÌ×£¨¶¨ÒåÖаüº¬ÒѾ¶¨ÒåµÄ½á¹¹Ì壩£¬Íê³É½á¹¹Éϵļ̳С£Í¨¹ýSET_CLASSÍê³ÉÊý¾ÝÒâÒåÉϵļ̳С£ËùÓеļ̳ж¼ÊÇPublicµÄ¡£ ¶à̬£º¶à̬µÄÏÁÒåÀí½âÊǶÔÓÚͬһ¸öº¯ÊýµÄµ÷Óý«Óв»Í¬µÄÐÐΪ¡£ÎÒÃÇͨ¹ýÒÔϱȽϹ۲죬ΪʲôÕâ¸ö¶ÔÏóÄ£ÐÍÖ§³ÖÁ˶à̬£¨ÒòΪËüÖ§³ÖÁËÅÉÉúÀà¶ÔÓÚ»ùÀຯÊýµÄ¸Äд£©¡£ class Shape { virtual float getArea(); ¡¡ }; class Cicle: public Shape { float getArea(); ¡¡ }; µ±Äãͨ¹ý¶ÔÏóÖ¸Õëµ÷ÓÃÒ»¸ö¶ÔÏóÖеÄÐ麯ÊýµÄʱºò¡£ÆäʵÄãÔÚ±àÒëµÄʱºòÒѾָ¶¨Á˸ÃÖ¸ÕëµÄÀàÐÍ¡£±ÈÈ磺 float getArea(Shape* shp) { return shp->getArea(); } ËùÒÔ£¬±àÒëÆ÷¿ÉÒÔͨ¹ý²éѯ±àÒëʱµÄÐÅÏ¢À´È·¶¨ÄãËùµ÷Óõĺ¯ÊýÔÚvtblÖеÄË÷ÒýλÖá£È»ºóÕâ¸öµ÷Óþͻᱻһ¸ö²éѯvtbl£¬È»ºócallËù´úÌæ¡£¶øÔËÐеÄʱºò£¬´«À´µÄÖ¸Õëshp²¢²»Ò»¶¨¾ÍÊÇShapeÀàÐÍ£¬¶øÊÇËûµÄ¼Ì³ÐÀàÐÍ¡£ÕâÑùÁ½¸öÀàµÄvtblÄÚÈÝ¿ÉÄܲ»Ò»Ñù£¨ÅÉÉúÀà¸ÄдÁËÆäÖеÄijЩslotµÄµØÖ·£©¡£ËùÒÔ£¬ÕâÑù¾Í¿ÉÒÔʵÏÖÔÚ²»ÖªµÀÅÉÉúÀàÊÇʲôµÄÇé¿öϵ÷ÓÃÅÉÉúÀàµÄº¯Êý¡£°ÂÃØ¾ÍÔÚÓÚÅÉÉúÀàºÍ»ùÀà¶¼°Ñ¸÷×ÔµÄʵÏÖ°æ±¾·ÅÔÚÁËvtblµÄÏàͬλÖᣱàÒëÆÚÈ·¶¨ÁËλÖã¬ÔËÐÐʱȷ¶¨Á˸ÃλÖõÄÄÚÈÝ¡£ ¶øÕâ¸ö»ã±à°æµÄobject modelÄØ£¿Æäʵ²î²»¶à¡£mov edx, hCircleºÍ invoke (Shape PTR [edx]).getArea, edx¾ÍÊÇÒ»¸ö¶à̬µÄµ÷Óá£hCircleʵ¼ÊÖ¸ÏòÒ»¸öCircleÀàÐ͵ĶÔÏó£¨ÔÚÕâÀï¶ÔÏó¼´ÓÐÊý¾ÝÓֳе£ÁËvtblµÄÈÎÎñ£©¡£¶øµ÷ÓõÄʱºòÉè¼ÆÊǰÑÕâ¸öÖ¸Õë×÷ΪShapeÀàÐÔ½âÊ͵ġ£Ò²¾ÍÊǰ´ÕÕshapeÀàÐÍÖÐgetAreaËùÔÚµÄindexÀ´µ÷Óá£ÏàͬµÄindexË÷Òýµ½²»Í¬µÄº¯Êý£¬¶à̬¾Í²úÉúÁË¡£ -------------------------------------------------------------------------------- ¿ÉÄܵĸĽø ¹ØÓÚÐ麯Êý Æäʵ˵ʵ»°£¬Õâ¸ö¶ÔÏóģʽ×öµÃʵÔÚÊǺܲ»´í£¬½«ºêµÄ¹¦ÄÜ·¢»Óµ½Á˼«Ö¡£²»¹ýËüÇ¿ÖÆµÄÒªÇóËùÓеÄÀà¶¼ÓÐÒ»¸övirtual destructorºÍËùÓеĺ¯Êý¶¼ÊÇvirtual¡£ÔÚºêµÄÄÜÁ¦Ëù¼°µÄ·¶Î§ÄÚ£¬ÒѾ½«¶¨ÒåºÍµ÷Óö¼×öµÃ¾¡¿ÉÄܵļòµ¥£¬Ê¹ÓÃÆðÀ´Ò²µÄÈ·ÓÐÉÍÐÄÔÃÄ¿µÄ¸Ð¾õ¡£²»¹ýÎÒ¾õµÃ²»Òª°ÑËùÓеĺ¯Êý¶¼·ÅÔÚ¶ÔÏóÖÐ(¼´Ç¿ÖÆÐÔµÄ×÷ΪÐ麯Êý£©£¬ÄÇÑù»áÔö¼ÓÒ»¶¨µÄ³É±¾¡£ C++°Ñ·ÇÐéµÄ³ÉÔ±º¯Êý¿´×÷ÊÇÆÕͨµÄº¯Êý£¬·ÅÔÚ¶ÔÏóÖ®Íâ¡£ÆäʵÎÒ¾õµÃÕâ¸ö¶ÔÏóÄ£ÐÍÒ²¿ÉÒÔ²ÉÓ᣶øÏÖÓеÄÇ¿ÖÆÐԵĽ«Ò»Ð©³ÉÔ±º¯ÊýÔÐÍÃû³ÆÏÞ¶¨Îª¡°ÀàÐÍÃû_º¯ÊýÃûPto¡±£¬²»ÈçÌṩһ¸öºêÀ´Õâô×öºÃÁË¡£ ÎҵĽ¨Ò飬½«²¿·Öº¯Êý·ÅÈë¶ÔÏóÖУ¨¾ÍÊÇÓÃCMETHODÀ´ÉùÃ÷ÓÚÀàÖУ©¡£¶øÆäËûÔò²»·ÅÈ룬ֻÊÇдÔÚͬһ¸öÎļþÖС£È»ºóÓÃMETHODµ÷ÓöÔÏóµÄmember-functionʱ£¬Ëü»áÔÚ»ã±àʱ¾ö¶¨Õâ¸ömember-functionÊÇ·ñ´æÔÚÓÚÐ麯Êý±í£¨Ò²¾ÍÊǶÔÏó±¾Éí´æ·ÅµÄһϵÁк¯ÊýÖ¸Õ룩ÖС£Èç¹û²»ÊÇÔò°´ÕÕÆÕͨº¯ÊýµÄÒ»Ñùµ÷Óá£Èç¹ûÊÇÔò°´ÕÕÏÖÔÚÕâ¸öģʽµ÷ÓᣠMETHODÕâ¸öºêÒ²ÊDZàдµÃ³öÀ´µÄ¡£ÔÚSUPERÕâ¸öºêÖоÍÓмìÑé¸ÃmethodÊÇ·ñÔÚ»ùÀàÖеÚÒ»´Î³öÏÖ£¨¶øÇÒ»¹ÊµÏÖÁ˼ìÑéÊÇ·ñÊÇÉÏÒ»²ã¶ø²»ÊǶà²ã»ùÀàµÄ¼ìÑ飩¡£ÕâôMETHODÒ²¿ÉÒÔ¼ìÑéµ÷Óõķ½·¨ÊÇ·ñÔÚclassÖгöÏÖ¹ý£¬È»ºó·Ö±ðʹÓò»Í¬µÄº¯Êýµ÷Óð취¡£ ¹ØÓÚSUPER Õâ¸ömodelÖÐÖ»Äܵ÷ÓÃÉÏÒ»²ã£¨Ò²¾ÍÊǸ¸ÀàµÄ£©µÄ±»¸²¸ÇµÄº¯Êý£¬¶ÔÓÚÉÏÉÏÒ»²ãµÄ±»¸²¸ÇµÄº¯ÊýÔòÎÞ·¨SUPERÁË¡£ÆäÖеÄÕϰÔÚÓÚÎÞ·¨ÖªµÀÄǸöº¯ÊýÊÇÔÚÄĸöÀàÐÍÖеÚÒ»´Î³öÏÖ¡£ÎÒÏëÈç¹ûÊÖ¹¤ÌṩÕâ¸öÀàÃû£¬Ôò¿ÉÒÔSUPERÈÎÒâ²ã´ÎµÄ±»¸²¸ÇÁ˵ĺ¯Êý¡£ÏñÕâÑù£º SUPER getArea SUPER getArea, Shape ûÓÐÌṩ¾ßÌåµÄÀàÃû£¬ÔòÈÏΪÊÇSUPERÉÏÒ»²ãµÄ£¬·ñÔòʹÓþßÌåµÄÀàÃûÀ´SUPER¡£SUPERµÄ°ÂÃØÒ²¾ÍÊDzéѯ·ÅÔÚ.data¶ÎµÄ¡°ÀàÐÍÃû_initdata¡±ÖÐÊý¾ÝÀ´´ïµ½¡°»Ö¸´¡±±»¸ÄдµÄº¯ÊýµÄ¹¦ÄÜ¡£ Ëæ±ã½²Ò»¾ä£¬TASMÖеÄTABLEÈ´¿ÉÒÔÃÖ²¹OVERRIDEµÄȱÏÝ£¬ÊÇÒ»ÖÖ¸üºÃµÄSTRUC¡£²»¹ýÄÇÊÇBorland¼ÓÇ¿Óï·¨µÄ½á¹û¡£ÎÞÂÛÈçºÎThomas×öµ½ÕâÒ»²½Ò²ËãÊÇÏ൱À÷º¦¡£ |
2Â¥2006-08-26 09:58:16













WORD
»Ø¸´´ËÂ¥