30-1-³ª.°¡»ó ÇÔ¼öÀÇ °³³ä

´ÙÀ½ ¿¹Á¦´Â °¡»ó ÇÔ¼öÀÇ Çʿ伺À» ¼³¸íÇϱâ À§ÇÑ À߸øµÈ ¿¹Á¦ÀÌ´Ù. ÀÌ ¿¹Á¦°¡ ¾î¶² ¹®Á¦Á¡À» °¡Áö°í ÀÖ´ÂÁö ºÐ¼®ÇØ º¸°í ÇØ°á ¹æ¹ýÀ» »ý°¢ÇØ º¸ÀÚ. ¼³¸íÀ» À§ÇÑ ¿¹Á¦À̹ǷΠ½Ç¿ë¼ºÀº ÀüÇô ¾ø´Ù.

 

¿¹ Á¦ : VirtFunc

#include <Turboc.h>

 

class Base

{

public:

     void OutMessage() { printf("Base Class\n"); }

};

 

class Derived : public Base

{

public:

     void OutMessage() { printf("Derived Class\n"); }

};

 

void main()

{

     Base B,*pB;

     Derived D;

 

     pB=&B;

     pB->OutMessage();

     pB=&D;

     pB->OutMessage();

}

 

Base Ŭ·¡½º¿¡ OutMessage¶ó´Â ¸â¹ö ÇÔ¼ö°¡ ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç ÀÌ ÇÔ¼ö´Â ÀÚ½ÅÀÇ ¼Ò¼ÓÀ» È­¸éÀ¸·Î Ãâ·ÂÇϱ⸸ ÇÑ´Ù. Base·ÎºÎÅÍ ÆÄ»ýµÈ Derived´Â OutMessage ¸â¹ö ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ¿© ¿ø·¡ÀÇ ÇÔ¼ö¿Í ´Ù¸¥ ¹®ÀÚ¿­À» Ãâ·ÂÇϵµ·Ï Çß´Ù. main¿¡¼­´Â BaseÇüÀÇ B¿Í DerivedÇüÀÇ D¸¦ ¼±¾ðÇÏ°í BaseÇüÀÇ Æ÷ÀÎÅÍ pB·Î ÀÌ µÎ °´Ã¼ÀÇ ¹øÁö¸¦ Â÷·Ê´ë·Î ´ëÀÔ¹ÞÀº ÈÄ Æ÷ÀÎÅÍ·Î OutMessage¸¦ È£ÃâÇß´Ù.

pB°¡ B¸¦ °¡¸®Å°´Â »óȲ¿¡¼­ pB->OutMessage´Â BaseÀÇ OutMessage¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. ±×·¸´Ù¸é pB°¡ D¸¦ °¡¸®Å³ ¶§´Â DerivedÀÇ OutMessage¸¦ È£ÃâÇÒ °Íó·³ º¸ÀδÙ. ÀÌ ¿¹Á¦¸¦ ¸¸µç »ç¶÷ÀÇ Àǵµ´Â ¹Ù·Î ÀÌ·± µ¿ÀÛÀ̾ú´Ù. ±×·¯³ª ½ÇÇàÇØ º¸¸é ¿¹»ó°ú´Â ´Ù¸¥ °á°ú°¡ ³ª¿Â´Ù.

 

Base Class

Base Class

 

¾Õ Ç׿¡¼­ ¾Ë¾Æ ºÃ´Ù½ÃÇÇ ºÎ¸ð Ŭ·¡½º ŸÀÔÀÇ Æ÷ÀÎÅÍ pB°¡ ÀÚ½Ä °´Ã¼ D¸¦ °¡¸®Å°´Â °ÍÀº ¹®¹ýÀûÀ¸·Î ÇÕ´çÇÏ´Ù. ±×·±µ¥ pB°¡ D¸¦ °¡¸®Å°´Â »óȲ¿¡¼­ ¸â¹ö ÇÔ¼ö È£ÃâÀº ¿Ö BaseÀÇ °ÍÀÌ È£ÃâµÇ´Â°¡? ±× ÀÌÀ¯´Â ÄÄÆÄÀÏ·¯°¡ Æ÷ÀÎÅÍÀÇ Á¤Àû ŸÀÔÀ» º¸°í ÀÌ Å¸ÀÔ¿¡ ¸Â´Â ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇϱ⠶§¹®ÀÌ´Ù. pB°¡ Base * ŸÀÔÀ¸·Î ¼±¾ðµÇ¾î ÀÖÀ̹ǷΠBaseÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù.

ÀÌ°ÍÀº ¿øÇÏ´Â °á°ú°¡ ¾Æ´Ï´Ù. ÀÌ ¿¹Á¦°¡ ÀǵµÇÏ´Â ¹Ù´Â pB°¡ ¼±¾ðµÈ Æ÷ÀÎÅÍ Å¸ÀÔ(Á¤Àû ŸÀÔ)¿¡ µû¶ó ¸â¹ö ÇÔ¼ö¸¦ ¼±ÅÃÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó pB°¡ °¡¸®Å°°í ÀÖ´Â °´Ã¼ÀÇ Å¸ÀÔ(µ¿Àû ŸÀÔ)¿¡ µû¶ó ¸â¹ö ÇÔ¼ö°¡ ¼±Åõǵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. pB°¡ Base *·Î ¼±¾ðµÇ¾úÁö¸¸ DerivedÀÇ °´Ã¼¸¦ °¡¸®Å°°í ÀÖÀ» ¶§´Â DerivedÀÇ ¸â¹ö ÇÔ¼ö°¡ È£ÃâµÇµµ·Ï ÇÏ°í ½Í´Ù. ÀÌ·¸°Ô ÇÏ°í ½Í´Ù¸é ¿øÇÏ´Â ÇÔ¼öÀÇ ¼±¾ð¹®¿¡ virtual Å°¿öµå¸¦ ºÙ¿© ÀÌ ÇÔ¼ö¸¦ °¡»ó ÇÔ¼ö·Î ¼±¾ðÇÑ´Ù. ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class Base

{

public:

     virtual void OutMessage() { printf("Base Class\n"); }

};

 

class Derived : public Base

{

public:

     virtual void OutMessage() { printf("Derived Class\n"); }

};

 

ºÎ¸ðÀÇ ¸â¹ö ÇÔ¼ö°¡ °¡»ó ÇÔ¼öÀ̸é ÀÚ½ÄÀÇ ¸â¹ö ÇÔ¼öµµ ÀÚµ¿À¸·Î °¡»ó ÇÔ¼ö°¡ µÇ¹Ç·Î DerivedÀÇ OutMessage¿¡´Â ±»ÀÌ virtual Å°¿öµå¸¦ ¾²Áö ¾Ê¾Æµµ µÇÁö¸¸ ÀÌ ÇÔ¼ö°¡ °¡»ó ÇÔ¼ö¶ó´Â °ÍÀ» ºÐ¸íÈ÷ Ç¥½ÃÇϱâ À§ÇØ ¾çÂÊ¿¡ ¸ðµÎ ºÙÀÌ´Â °ÍÀÌ ´õ ÁÁ´Ù. virtual Å°¿öµå´Â Ŭ·¡½º ¼±¾ð¹® ³»¿¡¼­¸¸ ¾µ ¼ö ÀÖÀ¸¸ç ÇÔ¼ö Á¤ÀǺο¡¼­´Â ¾µ ¼ö ¾ø´Ù. Á¤ÀǺο¡ virtualÀ» ¾²¸é ¿¡·¯ 󸮵ǹǷΠÇÔ¼ö¸¦ ¿ÜºÎ Á¤ÀÇÇÒ ¶§´Â virtual Å°¿öµå¾øÀÌ ÇÔ¼öÀÇ º»Ã¼¸¸ ±â¼úÇØ¾ß ÇÑ´Ù.

ÀÌ·¸°Ô °¡»ó ÇÔ¼ö·Î ¼±¾ðÇϸé Æ÷ÀÎÅÍÀÇ Å¸ÀÔÀÌ ¾Æ´Ñ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °´Ã¼ÀÇ Å¸ÀÔ¿¡ µû¶ó ¸â¹ö ÇÔ¼ö¸¦ ¼±ÅÃÇϹǷΠ¿øÇÏ´Â °á°ú°¡ ³ª¿Â´Ù. Áï, °¡»ó ÇÔ¼ö¶õ Æ÷ÀÎÅÍÀÇ Á¤Àû ŸÀÔÀÌ ¾Æ´Ñ µ¿Àû ŸÀÔÀ» µû¸£´Â ÇÔ¼öÀÌ´Ù. ¼öÁ¤ ÈÄÀÇ Ãâ·Â °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

Base Class

Derived Class

 

OutMessage ÇÔ¼ö°¡ °¡»óÀ¸·Î ¼±¾ðµÇ¾úÀ¸¹Ç·Î pB°¡ °¡¸®Å°´Â °´Ã¼ÀÇ Å¸ÀÔ¿¡ µû¶ó ´©±¸ÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀΰ¡°¡ °áÁ¤µÈ´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì °´Ã¼¸¦ °¡Áö°í ÀÖ´Â »óȲ¿¡¼­ Æ÷ÀÎÅÍ·Î °£Á¢ È£ÃâÇÒ ÇÊ¿ä´Â »ç½Ç ¾ø´Ù. D.OutMessage()¶ó°í È£ÃâÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ±×·¯³ª °´Ã¼¸¦ ÇÔ¼öÀÇ Àμö·Î Àü´ÞÇϰųª °´Ã¼ÀÇ ¹è¿­À» ÀÛ¼ºÇÒ ¶§´Â »çÁ¤ÀÌ ´Ù¸£´Ù. °´Ã¼´Â µ¢Ä¡°¡ Ä¿¼­ Åë»ó Æ÷ÀÎÅÍ·Î Àü´ÞÇϹǷΠ°´Ã¼ Æ÷ÀÎÅÍ·Î ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °æ¿ì°¡ ¿ÀÈ÷·Á ´õ ÈçÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ¿¹Á¦ÀÇ ¸ð¾çÀ» Á¶±Ý º¯°æÇÏ¿© Ŭ·¡½º ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾ÆµéÀÌ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇØ º¸ÀÚ.

 

¿¹ Á¦ : VirtFunc2

#include <Turboc.h>

 

class Base

{

public:

     virtual void OutMessage() { printf("Base Class\n"); }

};

 

class Derived : public Base

{

public:

     virtual void OutMessage() { printf("Derived Class\n"); }

};

 

void Message(Base *pB)

{

     pB->OutMessage();

}

 

void main()

{

     Base B;

     Derived D;

 

     Message(&B);

     Message(&D);

}

 

Message ÇÔ¼ö´Â Base *ÇüÀÇ Æ÷ÀÎÅÍ pB¸¦ ¹Þ¾Æµé¿© ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °´Ã¼ÀÇ OutMessage ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. main¿¡¼­ &B¿¡ ´ëÇØ ±×¸®°í &D¿¡ ´ëÇØ Message ÇÔ¼ö¸¦ µÎ ¹ø È£ÃâÇߴµ¥ Àü´ÞµÇ´Â °´Ã¼ ŸÀÔ¿¡ µû¶ó ½ÇÁ¦ È£ÃâµÉ OutMessage ÇÔ¼ö°¡ ´Þ¶óÁø´Ù. ¸¸¾à OutMessage°¡ °¡»ó ÇÔ¼ö°¡ ¾Æ´Ï¶ó¸é Message ÇÔ¼ö´Â BaseÀÇ ¸â¹ö ÇÔ¼ö¸¸ È£ÃâÇϹǷΠ°á°ú´Â Ç×»ó "Base Class"°¡ µÉ °ÍÀÌ´Ù.

OutMessage ÇÔ¼ö°¡ °¡»óÀ¸·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î Çü½Ä Àμö pB°¡ Àü´Þ¹Þ´Â °´Ã¼ÀÇ Å¸ÀÔ¿¡ µû¶ó È£ÃâµÉ ÇÔ¼ö°¡ °áÁ¤µÈ´Ù. Message ÇÔ¼öÀÇ º»Ã¼ ÄÚµå´Â ¿ÏÀüÈ÷ ¶È°°Àºµ¥ Àü´ÞµÇ´Â °´Ã¼¿¡ µû¶ó ½ÇÁ¦ µ¿ÀÛÀº ´Þ¶óÁø´Ù. pB->OutMessage() ¶ó´Â Äڵ尡 °æ¿ì¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇÒ ¼ö ÀÖ´Â ´É·Â, ÀÌ°ÍÀÌ ¹Ù·Î ´ÙÇü¼ºÀÇ °³³äÀÌ´Ù.

ºÎ¸ð Ŭ·¡½ºÇüÀÇ Æ÷ÀÎÅͷκÎÅÍ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ºñ°¡»ó ÇÔ¼ö´Â Æ÷ÀÎÅÍ°¡ ¾î¶² °´Ã¼¸¦ °¡¸®Å°´Â°¡¿¡ »ó°ü¾øÀÌ Ç×»ó Æ÷ÀÎÅÍ Å¸ÀÔ Å¬·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ¹Ý¸é °¡»ó ÇÔ¼ö´Â Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ½ÇÁ¦ °´Ã¼ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ±×·¡¼­ ÆÄ»ýŬ·¡½º¿¡¼­ ÀçÁ¤ÀÇÇÏ´Â ¸â¹ö ÇÔ¼ö, ¶Ç´Â ¾ÕÀ¸·Î¶óµµ ÀçÁ¤ÀÇÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¸â¹ö ÇÔ¼ö´Â °¡»óÀ¸·Î ¼±¾ðÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±×·¡¾ß ºÎ¸ð Ŭ·¡½ºÀÇ Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î ÀÚ½Ä °´Ã¼ÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇصµ Á¤È®ÇÏ°Ô È£ÃâµÈ´Ù.