ǰÑÔ
C++µÄ³ÉÔ±º¯Êý·ÖΪ¾²Ì¬º¯Êý¡¢·Ç¾²Ì¬º¯ÊýºÍÐ麯ÊýÈýÖÖ£¬ÔÚ±¾ÏµÁÐÎÄÕÂÖУ¬¶à´¦Ìáµ½staticºÍnon-static²»Ó°Ïì¶ÔÏóÕ¼ÓõÄÄڴ棬¶øÐ麯ÊýÐèÒªÒýÈëÐéÖ¸Õ룬ËùÒÔÐèÒªµ÷Õû¶ÔÏóµÄÄÚ´æ²¼¾Ö¡£¼ÈÈ»ÒѾ½â¾öÁËÊý¾Ý£¬º¯ÊýµÈÔÚÄÚ´æÖеIJ¼¾ÖÎÊÌ⣬ÏÂÒ»¸öÐèÒª¿¼ÂǵľÍÊÇÈçºÎµ÷Óã¬ÉÏÊöÌáµ½µÄÈýÖÖº¯ÊýµÄµ÷ÓûúÖÆ¶¼²»Ò»Ñù£¬Æä¼äµÄ²îÒìÕýÊDZ¾Æª²©¿ÍÐèÒªÌÖÂ۵ġ£
·Ç¾²Ì¬³ÉÔ±º¯Êý
C++µÄÉè¼Æ×¼ÔòÖ®Ò»¾ÍÊÇ£º·Ç¾²Ì¬³ÉÔ±º¯ÊýÖÁÉÙ±ØÐëºÍÒ»°ãµÄ·Ç³ÉÔ±º¯ÊýÓÐÏàͬµÄЧÂÊ¡£Òª´ïµ½ÕâÒ»µã£¬³ÉÔ±º¯ÊýµÄ³ÉÔ±ÊôÐÔ²»»á¸øÆä´øÀ´¶îÍâµÄ¸ºµ£¡£¿¼ÂÇÒÔÏÂÁ½ÖÖº¯Êýµ÷Óãº
int getAge(Animal *_this);//·Ç³ÉÔ±º¯Êý int Animal::getAge();//³ÉÔ±º¯Êý //getNumº¯Êý¶¨ÒåÈçÏ£º int getAge(){ return age; }
|
ǰÕßÐèÒª´«ÈëÒ»¸öÀàÖ¸Õ룬ÊôÓڷdzÉÔ±º¯Êýµ÷Ó㬺óÕßÖ±½ÓÖ¸Ã÷AnimalÀàµÄº¯Êýµ÷Óᣱ¾ÖÊÉÏ£¬ÕâÁ½¸öº¯ÊýÊÇÒ»ÑùµÄ£¬ÒòΪ±àÒëÆ÷»á½«ºóÕßת»»ÎªÇ°Õߣ¬Æäת»»²½ÖèÈçÏ£º
1.¸Äдº¯ÊýµÄÔÐÍ£¬Ê¹µÃÆä½ÓÊÜÒ»¸ö¶îÍâµÄ²ÎÊý£¬Õâ¸ö¶îÍâµÄ²ÎÊý¾ÍÊǺ¯ÊýµÄthisÖ¸Õ룺
int Animal::getNum(Animal *this);//ÔÚº¯ÊýÄÚ°²²åÒ»¸öthisÖ¸Õë |
2.½«Ã¿Ò»¸ö¶Ô·Ç¾²Ì¬³ÉÔ±±äÁ¿µÄ´æÈ¡²Ù×÷¸ÄΪ¾ÓÉthisÖ¸ÕëÀ´´æÈ¡£º
3.½«³ÉÔ±º¯ÊýÖØÐ´³ÉÒ»¸öÍⲿº¯Êý£¬º¯ÊýÃû³Æ¾¹ý¡°mangling¡±´¦Àí£¬Ê¹ËüÔÚ³ÌÐòÖгÆÎª¶ÀÒ»ÎÞ¶þµÄÓï»ã£¬ÈçÉÏÊöº¯Êý¿ÉÄܱ»´¦ÀíΪ£ºgetNum_AnimalFv(p)£¬ÕâÀïÐèÒª±£Ö¤Ãû×Ö²»»áÓгåÍ»£¡
ÕâÀïÒýÉêһϣ¬extern ¡°C¡±²Ù×÷»áÒÖÖÆº¯ÊýÃû³ÆµÄ¡°mangling¡±Ð§¹û£¬ÓÃÓÚÔÚC++Öе÷ÓÃCº¯Êý¡£
ËùÒÔ£¬½«Ò»¸ö³ÉÔ±º¯Êý¸Äд³ÉÒ»¸ö·Ç³ÉÔ±º¯ÊýµÄ¹Ø¼üÔÚÓÚÁ½µã£ºÒ»ÊÇÄܹ»Ìṩ¸øº¯ÊýÒ»¸ö¶Áд³ÉÔ±±äÁ¿µÄͨµÀ£¬¶þÊǽâ¾öºÃÓпÉÄÜ´øÀ´µÄÃû×Ö³åÍ»¡£Ç°Õßͨ¹ý´«µÝÒ»¸öthisÖ¸Õë¿ÉÒԺܺõĽâ¾ö£¬ºóÕßÔòͨ¹ýÒ»¶¨µÄÃû×Öת»»¹æÔòÀ´È·±£Ãû×ֵĶÀÒ»ÎÞ¶þÐÔ¡£
ÐéÄâ³ÉÔ±º¯Êý
ÎÒÃÇÀ´»ØÏëÒ»ÏÂÈç¹ûÒ»¸öÀàÖдæÔÚÐ麯Êý£¬±àÒëÆ÷»á×öÒÔÏÂÈý¼þÊ£º
1.Ϊ¸ÃÀà·ÖÅäÒ»¸öÐ麯Êý±í£¬Ëü´æÓÐÐ麯ÊýÔÚÖ´ÐÐÆ÷µÄµØÖ·
2. ÔÚ¸ÃÀàÖа²²åÒ»¸öÐéÖ¸Õ룬ָÏò¸ÃÀàµÄÐé±í
3.½«Ã¿Ò»¸öÐ麯ÊýµÄÈë¿ÚµØÖ·´æ·ÅÔÚÐ麯Êý±íÖÐÏàÓ¦µÄslot
ËùÒÔ£¬ÒªÏëÕýÈ·µ÷ÓÃÐ麯Êý£¬Ö»ÐèÕÒµ½¸ÃÐ麯ÊýÔÚÐ麯Êý±íµÄÏàӦλÖü´¿É£¬ÓÚÊÇ£¬¿¼Âǵ½ÒÔÏÂʾÀý¡£
class Animal{ public: char name[10];//¶¯ÎïÃû×Ö int weight;//ÌåÖØ virtual void eat(){} }; Animal *animal; animal->eat();
|
µ±µ÷ÓÃÐ麯ÊýeatµÄʱºò£¬±àÒëÆ÷»á×Ô¶¯×ª»»³ÉÒÔÏ´úÂ룺
//vptrΪָÏòÐ麯Êý±íµÄÖ¸Õ룬eat´æ·ÅÔÚÐ麯ÊýµÄµÚһ룬 //ÓÉÓÚÊdzÉÔ±º¯Êý£¬ËùÒÔº¯Êý»¹±ØÐë´«ÈëÒ»¸öthisÖ¸Õë²ÎÊý (* animal->vptr[0])(animal);
|
Ö»ÓÐÔÚÖ¸ÕëºÍÒýÓòÅÄÜÕ¹ÏÖ³ö¶à̬µÄÐÎʽ£¬Èç¹ûÎÒÃÇÏÔʾµ÷ÓûòÕßÖ±½ÓÓÃÀà¶ÔÏóÀ´µ÷Óõϰ»áÊÇʲôÑùÄØ£¿
//ÏÔʾµ÷ÓÃeatº¯Êý Animal::eat(); //Ö±½ÓÓöÔÏóÀ´µ÷Óà Animal animal; animal.eat();
|
ÔÚÉÏÊöÁ½ÖÖµ÷ÓÃÖУ¬Ç°Õß»áÒÖÖÆµôÐéÄâ»úÖÆ£¬Ö±½Ó½«eat()×÷Ϊ·Ç¾²Ì¬³ÉÔ±º¯ÊýÒ»Ñùµ÷Ó᣶ÔÓÚºóÕߣ¬¼ÙÉè±àÒëÆ÷½«Æäת»»³ÉÈçÏÂÐÎʽ£º
(* animal.vptr[0])(&animal); |
ÕâÑùËäÈ»ÔÚÓïÒâÉÏÕýÈ·£¬µ«ÊÇÍêȫûÓбØÒªÕâÑù×ö£¬ËùÒÔ±àÒëÆ÷»áÖ±½Óµ±³ÉAnimal::eat()ÏÔʾµ÷ÓÃÀ´´¦Àí¡£
µ¥Ò»¼Ì³ÐϵÄÐ麯Êýµ÷ÓÃ
µ±Ò»¸öÀà¼Ì³Ð×ÔÒ»¸ö»ùÀàʱ£¬ÆäÖеÄÐ麯Êý¿ÉÄÜ·¢ÉúÈçÏÂÈýÖÖÇé¿ö£º
1.×ÓÀàÖеÄÐ麯Êý»áÖØÐ´¸¸ÀàµÄÐ麯Êý
2. ¼Ì³Ð×Ô»ùÀàµÄÐ麯ÊýʵÌ壬Ҳ¾ÍÊÇ»ùÀàÖдæÔÚ£¬×ÓÀàÖÐûÓÐÖØÐ´
3. Ò»¸ö´¿Ð麯Êý£¬ÓÃÀ´ÔÚÐ麯Êý±íÖС°Õ¼×ù¡±£¬Ò²¿ÉÒÔµ±×öÖ´ÐÐÆ÷Òì³£´¦Àíº¯Êý
Õë¶ÔÈçÉÏÈýÖÖÇé¿ö£¬×ÓÀàÔÚ¹¹½¨×Ô¼ºµÄÐ麯Êý±íʱ£¬»á×öÈçÏ´¦Àí£º
1.µ±ÖØÐ´Á˸¸ÀàµÄÐ麯Êýʱ£¬¾Í½«Ð麯Êý±íÖжÔÓ¦µÄslot¸Äд³É×ÓÀàµÄÐ麯ÊýÈë¿ÚµØÖ·
2. µ±¼Ì³Ð»ùÀàµÄÐ麯ÊýʵÀýʱ£¬Ö»ÐèÒª½«ÊµÀýµÄµØÖ·¿½±´µ½×ÓÀàµÄÐ麯Êý±íÖм´¿É
3.×ÓÀà¿ÉÒÔ¶¨Òå×Ô¼ºµÄÐ麯ÊýʵÀý£¬´æµµÔÚÐé±íµÄslotÖУ¬Ðé±íµÄ³ß´ç»áÔö´ó
ÕâÀﻹÊÇÒýÓÃ֮ǰ²©ÎÄÖн²¹ýµÄÒ»¸öʵÀýÀ´ËµÃ÷һϣ¬¿¼Âǵ½Èçϼ̳йØÏµ£º

ÆäÄÚ´æ²¼¾ÖÈçÏ£º

¿É¼ûÔÚ×ÓÀàÖÐÖØÐ¸ÄдÁËÐ麯Êý±í£¬ÄÇô£¬Õë¶ÔÕâÀà¼Ì³Ð£¬Ð麯ÊýʱÔõôµ÷ÓõÄÄØ£¿ÎÒÃÇ¿ÉÒԹ۲쵽¸¸ÀàµÄÐ麯Êý±íÖк¯ÊýµÄÏà¶ÔλÖÃÔÚ×ÓÀàÖÐÊÇûÓз¢Éú±ä»¯µÄ£¬£¬Õë¶ÔÓÚÈçϵ÷Óãº
void Fun(Dog *dog){ dog->eat(); } Dog* dog = new Dog(); Animal* animal = new Dog(); Fun(dog);//µÚÒ»ÖÖµ÷Ó÷½Ê½£¬Ö±½Ó´«ÈëÒ»¸ödogÖ¸Õë Fun(animal);//µÚ¶þÖÖµ÷Ó÷½Ê½£¬´«ÈëÒ»¸öanimalÖ¸Õë
|
Èç¹û´«ÈëµÄÊÇÒ»¸öDogÀàµÄ¶ÔÏóÖ¸Õ룬ÄÇôֱ½ÓÀûÓÃÉÏһС½ÚµÄ·½·¨¼´¿É£¬Èç¹û´«ÈëµÄÊÇÒ»¸öAnimalÀàµÄ¶ÔÏóÖ¸Õ룬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬»¹ÊÇÒ»Èç¼ÈÍùµÄ¿ÉÒÔ²ÉÓÃÉÏһС½ÚÖеķ½·¨£¬ÒòΪeat()ÔÚÐ麯Êý±íÖеÄλÖò¢Ã»Óз¢Éú±ä»¯£¬Î¨Ò»ÔÚÖ´ÐÐÆÚ²ÅÄÜÖªµÀµÄÊÇ£ºÄĸöµÄeat()º¯Êý±»µ÷Óá£
¶àÖØ¼Ì³ÐϵÄÐ麯Êýµ÷ÓÃ
ÓÐÁËÉÏÊöµÄÁ˽âÖ®ºó£¬ÎÒÃÇÖªµÀÐ麯ÊýµÄµ÷ÓÃÎÞ·ÇÊÇÐèÒªÂú×ãÒ»ÏÂÁ½µã£º
1.ÐèÒªÖªµÀÐ麯Êý±íµÄµØÖ·
2.ÐèÒªÖªµÀ¸ÃÐ麯ÊýÔÚÐ麯Êý±íÖеÄλÖÃ
µ«ÊÇ£¬ÔÚ¶àÖØ¼Ì³ÐÖУ¬Õâ¾Í±äµÃÓÐЩ¸´ÔÓÁË£¬¶àÖØ¼Ì³ÐÖдæÔÚ¶à¸öÐé±í£¬ÈçÏÂÃæÕâÑùµÄ¼Ì³Ð¹ØÏµºÍÄÚ´æ²¼¾Ö£º

ÆäÄÚ´æ²¼¾ÖÈçÏ£º
»¹ÊÇÒÔÉÏÃæµÄFunº¯ÊýΪÀý£¬¿¼ÂÇÏÂÃæ¼¸¸öµ÷Ó÷½Ê½£º
Dog *dog = new Dog(); dog->eat();//µÚÒ»ÖÖµ÷Ó÷½Ê½£¬Ö±½Ó´«ÈëÒ»¸ödogÖ¸Õë dog->sleep();//µÚ¶þÖÖµ÷Ó÷½Ê½£¬´«ÈëÒ»¸öanimalÖ¸Õë dog->jump();//µÚÈýÖÖµ÷Ó÷½Ê½£¬´«ÈëÒ»¸öcanidaeÖ¸Õë |
Õë¶ÔǰÁ½ÖÖµ÷Ó÷½Ê½£¬Æäµ÷Óøø·½Ê½ÓëÉÏһС½ÚÖлù±¾ÏàËÆ£¬²»ÐèÒª¸Ä±äthisÖ¸Õ룬ÒòΪµÚһ˳λ¼Ì³ÐÀàµÄÆðµãÓë×ÓÀà¶ÔÏóµÄÆðµãÒ»Ö¡£¶ÔÓÚµÚÈýÖÖµ÷Ó÷½Ê½À´ËµµÄ»°£¬¾ÍÏÔµÃÓÐЩ¸´ÔÓÁË¡£Èç¹û¼ÌÐø´«ÈëÒ»¸öûÓо¹ýµ÷ÕûµÄthisÖ¸ÕëµÄ»°£¬¾ÍÄÑÒÔ»ñÈ¡CanidaeµÄÐé±íµØÖ·ÁË¡£ÕâÀïÊ×ÏÈÀ´½éÉÜÒ»ÖÖThunk·½·¨¡£thunkµÄ×÷ÓÃÔÚÓÚ£º
1.ÒÔÊʵ±µÄoffsetÀ´µ÷ÕûthisÖ¸Õë
2.Ìøµ½¶ÔÓ¦µÄÐ麯ÊýÖÐ °´ÕÕthunkµÄ˼Ï룬ÔÙµ÷ÓÃjump()º¯Êýʱ£¬ÆäthisÖ¸ÕëÐèÒª×öÈçϵ÷Õû£º
thunk: this+=sizeof(Animal); Dog::eat(this); |
ºÃ£¬ÎÒÃǵÄÎÊÌâ¾Í±ä³É¶àÖØ¼Ì³Ð¹ØÏµÖУ¬³ý¼Ì³Ð˳ÐòµÄµÚһλÍ⣬ÆäËûλµÄÀàʵÏÖÐ麯Êýµ÷Óö¼ÐèÒª×öһЩµ÷Õû¡£ÕâÖÖµ÷Õû·¢ÉúÔÚÒÔÏÂÁ½ÖÖÇé¿ö£º
//Ò»¡¢½«Ò»¸ö»ùÀàÖ¸ÕëÖ¸ÏòÒ»¸ö×ÓÀà,µ±È»ÊǼ̳Ð˳ÐòµÚһλÒÔºóµÄ»ùÀà Canidae *canidae = new Dog(); //¶þ¡¢Ê¹ÓÃ×ÓÀàÖ¸ÕëÀ´µ÷ÓûùÀàµÄº¯Êý£¬µ±È»ÊǼ̳Ð˳ÐòµÚһλÒÔºóµÄ»ùÀຯÊý Dog dog = new Dog(); dog->jump();
|
ǰһÖÖÇé¿öÖУ¬ÐèÒª½«canidaeÖ¸ÕëÏòºóµ÷Õûsizeof(Animal)λ£¬Ö¸Ïò×ÓÀàÖжÔÓ¦µÄ»ùÀಿ·Ö¡£
µÚ¶þÖÖÇé¿ö£¬ÐèÒªµ÷ÕûdogÖ¸ÕëÏòºósizeof(Animal)λ£¬Ö¸ÏòdogÖÐCanidae»ùÀಿ·Ö¡£
ÕâÑùÒ»À´£¬¶ÔÓÚ¶àÖØ¼Ì³ÐϵÄÐ麯Êýµ÷ÓþͱȽÏÈÝÒ×Àí½âÁË£¬ÄãÀí½âÁËÂð£¿
ÐéÄâ¼Ì³ÐϵÄÐ麯Êýµ÷ÓÃ
Õë¶ÔÓÚÐé¼Ì³ÐÀ´Ëµ£¬ÆäÐé»ùÀàµÄµØÖ·ÔÚÄÚ´æ²¼¾ÖÖдæ·ÅµÄλÖöÔÓÚ²»Í¬µÄ±àÒëÆ÷À´Ëµ¶¼²»Ò»Ñù£¬ÊéÖÐÖ±½Ó˵Ïñ½øÁËÃÔ¹¬Ò»Ñù¡£ºÃ°É£¬ÎÒÊÇ»³×ÅÏò̽¾¿±¾Ô´µÄÄ¿µÄÀ´µÄ£¬±»×÷ÕßµÄÕâÒ»¾ä»°×Åʵ¸øÏŵ½ÁË¡£
ÔÚÐéÄâ¼Ì³ÐϵÄÐ麯Êýµ÷ÓÃÖУ¬Æä¸´ÔÓµãÒÀ¾ÉÔÚÓÚÈçºÎµ÷ÕûthisÖ¸Õ룬ÐéÄâ¼Ì³ÐÔÚ¶àÖØ¼Ì³ÐÉÏÓÖ¶àÁËÒ»¸öÐé»ùÀàÖ¸Õ룬ÕâʹµÃÇé¿ö¾Í±äµÃ¸´ÔÓ¶à±äÁË¡£
×÷Õß×îºó¸øÁËÒ»¸ö¶¨Ò壺²»ÒªÔÚÐé»ùÀàÖж¨Òå·Ç¾²Ì¬³ÉÔ±³ÉÔ±±äÁ¿£¬ÏëÀ´Ò²ÊÇÅÂÕâЩ»áÓ°ÏìÐé»ùÀàÖ¸ÕëÔÚÄÚ´æÖеIJ¼¾ÖλÖ㬴ӶøÔö¼ÓÁ˾ö¶¨Êʵ±µÄoffsetµÄ¸´ÔÓ¶È¡£
¾²Ì¬³ÉÔ±º¯Êý
¾²Ì¬³ÉÔ±º¯ÊýÏà±ÈÓÚÆäËû³ÉÔ±º¯ÊýÀ´Ëµ£¬×î´óµÄ²»Í¬¾ÍÊÇËüûÓÐthisÖ¸Õ룬ÆäÖ÷ÒªÌØÐÔÊÇ£º
1.Ëü²»Äܹ»Ö±½Ó´æÈ¡ÆäclassÖеķǾ²Ì¬³ÉÔ±±äÁ¿
2.Ëü²»Äܱ»ÉùÃ÷Ϊconst¡¢volatile»òvirtual
3.Ëü²»ÐèÒª¾ÓÉÀà¶ÔÏó²Å±»µ÷ÓÃ
ËùÒÔ£¬¶ÔÓÚ¾²Ì¬³ÉÔ±º¯ÊýµÄµ÷Óþͼ¸ºõµÈͬÓڷdzÉÔ±º¯Êýµ÷ÓÃÁË¡£µ±È»£¬ÎªÁËÖ¸Ã÷ËûÊÇÒ»¸öÀà³ÉÔ±º¯Êý£¬ÔÚÃüÃûµ÷ÕûÉϱØÈ»»á¼ÓÉÏÀàµÄÐÅÏ¢£¬ÈçÏ£º
nimal::getAge();//¼ÙÉègetAgeÊÇÒ»¸ö¾²Ì¬³ÉÔ±º¯Êý //Æä¾¹ýÃüÃûµ÷ÕûºóÈçÏ£º getAge_AnimalSFv();//SFv±íʾËûÊÇÒ»¸ö¾²Ì¬³ÉÔ±º¯Êý£¬static member Function,ÆäÓµÓÐÒ»¸ö¿Õ°×µÄ²ÎÊýÁбí(void) |
×ܽá
±¾Æª²©¿Í½²½âÁËÈýÀà³ÉÔ±º¯Êý(·Ç¾²Ì¬¡¢¾²Ì¬¡¢Ð麯Êý)µÄµ×²ãµ÷ÓûúÖÆ£¬ÒÔ¼°C++¶Ôº¯ÊýÃüÃû£¬thisÖ¸ÕëµÄµ÷Õû¹æÔòµÈ¡£ÎÒÃÇ¿ÉÒÔÖªµÀ£¬C++ÔÚ³ÉÔ±º¯Êýµ÷ÓÃÉÏ£¬¶ÔÓÚ¾²Ì¬£¬·Ç¾²Ì¬³ÉÔ±º¯ÊýÔÚº¯Êýµ÷ÓÃЧÂÊÉÏ»ù±¾µÈͬÓڷdzÉÔ±º¯Êý£¬¶øÐ麯ÊýµÄµ÷ÓÃÉÏΪÁËÂú×ã¶à̬ÐÔ£¬ÐèÒªµ÷ÕûthisÖ¸Õ룬ÕÒµ½Ðé±íµØÖ·µÈµÈ²Ù×÷£¬Ó°ÏìÁËÆäº¯Êýµ÷ÓÃЧÂÊ£¬²»¹ýÕâЩҲÊÇÖµµÃµÄ£¡
|