C++ÖеÄÐ麯Êý(virtual function)¶à̬(¶þ)

2014-11-24 12:50:41 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 1
// ·ÇÐéÎö¹¹º¯Êý
private:
char * ptra_;
};

class B: public A
{
public:
B() { ptrb_ = new char[20];}
~B() { delete[] ptrb_;}
private:
char * ptrb_;
};

void foo()
{
A * a = new B;
delete a;
}

ÔÚÕâ¸öÀý×ÓÖУ¬³ÌÐòÒ²Ðí²»»áÏóÄãÏëÏóµÄÄÇÑùÔËÐУ¬ÔÚÖ´ÐÐdelete aµÄʱºò£¬Êµ¼ÊÉÏÖ»ÓÐA::~A()±»µ÷ÓÃÁË£¬¶øBÀàµÄÎö¹¹º¯Êý²¢Ã»Óб»µ÷Óã¡ÕâÊÇ·ñÓеã¶ù¿ÉÅ£¿

Èç¹û½«ÉÏÃæA::~A()¸ÄΪvirtual£¬¾Í¿ÉÒÔ±£Ö¤B::~B()Ò²ÔÚdelete aµÄʱºò±»µ÷ÓÃÁË¡£Òò´Ë»ùÀàµÄÎö¹¹º¯Êý¶¼±ØÐëÊÇvirtualµÄ¡£

´¿ÐéµÄÎö¹¹º¯Êý²¢Ã»ÓÐʲô×÷Óã¬ÊÇÐéµÄ¾Í¹»ÁË¡£Í¨³£Ö»ÓÐÔÚÏ£Íû½«Ò»¸öÀà±ä³É³éÏóÀࣨ²»ÄÜʵÀý»¯µÄÀࣩ£¬¶øÕâ¸öÀàÓÖûÓкÏÊʵĺ¯Êý¿ÉÒÔ±»´¿Ð黯µÄʱºò£¬¿ÉÒÔʹÓô¿ÐéµÄÎö¹¹º¯ÊýÀ´´ïµ½Ä¿µÄ¡£

2.4 Ðé¹¹Ô캯Êý£¿
¹¹Ô캯Êý²»ÄÜÊÇÐéµÄ¡£

3. Ð麯ÊýʹÓü¼ÇÉ 3.1 privateµÄÐ麯Êý
¿¼ÂÇÏÂÃæµÄÀý×Ó£º

class A
{
public:
void foo() { bar();}
private:
virtual void bar() { ...}
};

class B: public A
{
private:
virtual void bar() { ...}
};

ÔÚÕâ¸öÀý×ÓÖУ¬ËäÈ»bar()ÔÚAÀàÖÐÊÇprivateµÄ£¬µ«ÊÇÈÔÈ»¿ÉÒÔ³öÏÖÔÚÅÉÉúÀàÖУ¬²¢ÈÔÈ»¿ÉÒÔÓëpublic»òÕßprotectedµÄÐ麯 ÊýÒ»Ñù²úÉú¶à̬µÄЧ¹û¡£²¢²»»áÒòΪËüÊÇprivateµÄ£¬¾Í·¢ÉúA::foo()²»ÄÜ·ÃÎÊB::bar()µÄÇé¿ö£¬Ò²²»»á·¢ÉúB::bar()¶Ô A::bar()µÄoverride²»Æð×÷ÓõÄÇé¿ö¡£

ÕâÖÖд·¨µÄÓïÒâÊÇ£ºA¸æËßB£¬Äã×îºÃoverrideÎÒµÄbar()º¯Êý£¬µ«ÊÇÄã²»Òª¹ÜËüÈçºÎʹÓã¬Ò²²»Òª×Ô¼ºµ÷ÓÃÕâ¸öº¯Êý¡£

3.2 ¹¹Ô캯ÊýºÍÎö¹¹º¯ÊýÖеÄÐ麯Êýµ÷ÓÃ
Ò»¸öÀàµÄÐ麯ÊýÔÚËü×Ô¼ºµÄ¹¹Ô캯ÊýºÍÎö¹¹º¯ÊýÖб»µ÷ÓõÄʱºò£¬ËüÃǾͱä³ÉÆÕͨº¯ÊýÁË£¬²»¡°Ð顱ÁË¡£Ò²¾ÍÊÇ˵²»ÄÜÔÚ¹¹Ô캯ÊýºÍÎö¹¹º¯ÊýÖÐÈÃ×Ô¼º¡°¶à̬¡±¡£ÀýÈ磺

class A
{
public:
A() { foo();} // ÔÚÕâÀÎÞÂÛÈçºÎ¶¼ÊÇA::foo()±»µ÷Óã¡
~A() { foo();} // ͬÉÏ
virtual void foo();
};

class B: public A
{
public:
virtual void foo();
};

void bar()
{
A * a = new B;
delete a;
}

Èç¹ûÄãÏ£Íûdelete aµÄʱºò£¬»áµ¼ÖÂB::foo()±»µ÷Óã¬ÄÇôÄã¾Í´íÁË¡£Í¬Ñù£¬ÔÚnew BµÄʱºò£¬AµÄ¹¹Ô캯Êý±»µ÷Ó㬵«ÊÇÔÚAµÄ¹¹Ô캯ÊýÖУ¬±»µ÷ÓõÄÊÇA::foo()¶ø²»ÊÇB::foo()¡£

3.3 ¶à¼Ì³ÐÖеÄÐ麯Êý 3.4 ʲôʱºòʹÓÃÐ麯Êý
ÔÚÄãÉè¼ÆÒ»¸ö»ùÀàµÄʱºò£¬Èç¹û·¢ÏÖÒ»¸öº¯ÊýÐèÒªÔÚÅÉÉúÀàÀïÓв»Í¬µÄ±íÏÖ£¬ÄÇôËü¾ÍÓ¦¸ÃÊÇÐéµÄ¡£´ÓÉè¼ÆµÄ½Ç¶È½²£¬³öÏÖÔÚ»ùÀàÖеÄÐ麯ÊýÊǽӿڣ¬³öÏÖÔÚÅÉÉúÀàÖеÄÐ麯ÊýÊǽӿڵľßÌåʵÏÖ¡£Í¨¹ýÕâÑùµÄ·½·¨£¬¾Í¿ÉÒÔ½«¶ÔÏóµÄÐÐΪ³éÏ󻯡£

ÒÔÉè¼ÆÄ£Ê½[2]ÖÐFactory MethodģʽΪÀý£¬CreatorµÄfactoryMethod()¾ÍÊÇÐ麯Êý£¬ÅÉÉúÀàoverrideÕâ¸öº¯Êýºó£¬²úÉú²»Í¬µÄProductÀ࣬±» ²úÉúµÄProductÀà±»»ùÀàµÄAnOperation()º¯ÊýʹÓ᣻ùÀàµÄAnOperation()º¯ÊýÕë¶ÔProductÀà½øÐвÙ×÷£¬µ±È» ProductÀàÒ»¶¨Ò²Óжà̬£¨Ð麯Êý£©¡£

ÁíÍâÒ»¸öÀý×Ó¾ÍÊǼ¯ºÏ²Ù×÷£¬¼ÙÉèÄãÓÐÒ»¸öÒÔAÀàΪ»ùÀàµÄÀà²ã´Î£¬ÓÖÓÃÁËÒ»¸östd::vectorÀ´±£´æÕâ¸öÀà²ã´ÎÖв»Í¬ÀàµÄʵÀýÖ¸Õ룬ÄÇôÄãÒ»¶¨Ï£ÍûÔÚ¶ÔÕâ¸ö¼¯ºÏÖеÄÀà½øÐвÙ×÷µÄʱºò£¬²»Òª°Ñÿ¸öÖ¸ÕëÔÙcast»Øµ½ËüÔ­À´µÄÀàÐÍ£¨ÅÉÉú Àࣩ£¬¶øÊÇÏ£Íû¶ÔËûÃǽøÐÐͬÑùµÄ²Ù×÷¡£ÄÇô¾ÍÓ¦¸Ã½«Õâ¸ö¡°Ò»ÑùµÄ²Ù×÷¡±ÉùÃ÷Ϊvirtual¡£

ÏÖʵÖУ¬Ô¶²»Ö»ÎÒ¾ÙµÄÕâÁ½¸öÀý×Ó£¬µ«ÊÇ´óµÄÔ­Ôò¶¼ÊÇÎÒÇ°ÃæËµµ½µÄ¡°Èç¹û·¢ÏÖÒ»¸öº¯ÊýÐèÒªÔÚÅÉÉúÀàÀïÓв»Í¬µÄ±íÏÖ£¬ÄÇôËü¾ÍÓ¦¸ÃÊÇÐéµÄ¡±¡£Õâ¾ä»°Ò²¿ÉÒÔ·´¹ýÀ´Ëµ£º¡°Èç¹ûÄã·¢ÏÖ»ùÀàÌṩÁËÐ麯Êý£¬ÄÇôÄã×îºÃoverrideËü¡±¡£

×÷Õß¡°±¾Ê¼ǵĸ»Î°Ð족