±â¹Ý Ŭ·¡½ºÀÇ ÆÄ±«ÀÚ´Â ¹Ýµå½Ã °¡»óÀ¸·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. ¿Ö ÆÄ±«ÀÚ´Â °¡»ó ÇÔ¼ö¿©¾ß ÇÏ´ÂÁö ¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸°í ÆÄ±«ÀÚ°¡ °¡»óÀÌ ¾Æ´Ò ¶§ ¾î¶² ¹®Á¦°¡ ¹ß»ýÇÏ´ÂÁö º¸ÀÚ.
|
¿¹ Á¦ : VirtDestructor |
#include <Turboc.h>
class Base
{
private:
char *B_buf;
public:
Base() { B_buf=new char[10];puts("Base »ý¼º"); }
~Base() { delete [] B_buf;puts("Base ÆÄ±«"); }
};
class Derived : public Base
{
private:
int *D_buf;
public:
Derived() { D_buf=new int[32];puts("Derived »ý¼º"); }
~Derived() { delete [] D_buf;puts("Derived ÆÄ±«"); }
};
void main()
{
// Derived D;
Base *pB;
pB=new Derived;
delete pB;
}
BaseÀÇ »ý¼ºÀÚ´Â Å©±â 10ÀÇ ¹®ÀÚÇü ¹è¿À» µ¿ÀûÀ¸·Î ÇÒ´çÇÏ¸ç ÆÄ±«ÀÚ¿¡¼ ÀÌ ¹è¿À» ÇØÁ¦ÇÑ´Ù. Base·ÎºÎÅÍ »ó¼Ó¹ÞÀº Derived´Â »ý¼ºÀÚ¿¡¼ Å©±â 32ÀÇ Á¤¼öÇü ¹è¿À» ÇÒ´çÇÏ¸ç ¸¶Âù°¡Áö·Î ÆÄ±«ÀÚ¿¡¼ ÇØÁ¦ÇÑ´Ù. °¢ Ŭ·¡½º°¡ µ¿Àû ÇÒ´çÀ» Çϰí ÀÖÁö¸¸ ÆÄ±«ÀÚ¿¡¼ ÇÒ´çµÈ ¹è¿À» Á¦´ë·Î ÇØÁ¦Çϰí ÀÖÀ¸¹Ç·Î ¸Þ¸ð¸® ´©¼ö´Â ¾øÀ» °Í °°´Ù.
°ú¿¬ ±×·±Áö main¿¡ Derived D; ¼±¾ð¹®¸¸ ³²°Ü ³õ°í ½ÇÇàÇØ º¸ÀÚ. °¢ Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿Í ÆÄ±«ÀÚ´Â ÀÚ½ÅÀÌ È£ÃâµÇ¾úÀ½À» ¾Ë¸®±â À§ÇØ ¹®ÀÚ¿À» Ãâ·ÂÇÑ´Ù. D °´Ã¼°¡ »ý¼ºµÉ ¶§´Â ºÎ¸ðÀÇ »ý¼ºÀÚ°¡ ¸ÕÀú È£ÃâµÇ°í ÀÚ½ÅÀÇ »ý¼ºÀÚ°¡ ½ÇÇàµÇ¸ç ÆÄ±«µÉ ¶§´Â ¹Ý´ë ¼ø¼·Î ÆÄ±«ÀÚ°¡ È£ÃâµÈ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
Base »ý¼º
Derived »ý¼º
Derived ÆÄ±«
Base ÆÄ±«
»ý¼ºÀÚ¿Í ÆÄ±«ÀÚÀÇ È£ÃâÀÌ ¾ÆÁÖ Á¤»óÀûÀÌ´Ù. D °´Ã¼°¡ ¿ÏÀüÈ÷ »ý¼ºµÇ¾úÀ» ¶§ ÀÌ °´Ã¼´Â Å©±â 10ÀÇ char ¹è¿°ú Å©±â 32ÀÇ int ¹è¿À» ¼ÒÀ¯ÇÒ °ÍÀ̸ç ÀÌ ¹è¿µéÀº »ý¼ºµÈ ¿ª¼øÀ¸·Î ÆÄ±«ÀÚ¿¡¼ Â÷·Ê´ë·Î ÇØÁ¦µÈ´Ù. ±×·¯³ª ¿©±â¿¡ Æ÷ÀÎÅͰ¡ °³ÀÔµÇ¸é ¹®Á¦°¡ ´Þ¶óÁø´Ù. new ¿¬»êÀÚ·Î DerivedÀÇ °´Ã¼¸¦ ¸¸µé°í ±× Æ÷ÀÎÅ͸¦ Base * ŸÀÔÀÇ pB¿¡ ´ëÀÔÇϸé Derived°¡ »ý¼ºµÉ ¶§ ºÎ¸ð¿Í ÀÚ½ÅÀÇ »ý¼ºÀÚ°¡ Â÷·Ê´ë·Î È£ÃâµÇ¾î µÎ °³ÀÇ ¹öÆÛ¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇÒ °ÍÀÌ´Ù.

±×·¯³ª delete pB·Î ÀÌ °´Ã¼¸¦ ÇØÁ¦ÇÒ ¶§´Â ºÎ¸ðÀÇ ÆÄ±«ÀÚ¸¸ È£ÃâµÇ´Âµ¥ ¿Ö³ÄÇϸé pB°¡ Base * ŸÀÔÀ̱⠶§¹®ÀÌ´Ù. Æ÷ÀÎÅÍÀÇ Å¸ÀÔ¿¡ µû¶ó ÆÄ±«ÀÚ°¡ Á¤ÀûÀ¸·Î °áÇյǴ٠º¸´Ï ½ÇÁ¦·Î ÆÄ±«µÇ´Â °´Ã¼´Â Derived ŸÀÔÀÌÁö¸¸ DerivedÀÇ ÆÄ±«ÀÚ°¡ È£ÃâµÇÁö ¸øÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ºÎ¸ð°¡ ÇÒ´çÇÑ char ¹è¿Àº Àß ÇØÁ¦µÇÁö¸¸ Derived°¡ ÇÒ´çÇÑ int ¹è¿Àº ÇØÁ¦µÇÁö ¸øÇÏ´Â ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÑ´Ù. ½ÇÇàÇØ º¸¸é DerivedÀÇ ÆÄ±«ÀÚ°¡ È£ÃâµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
Base »ý¼º
Derived »ý¼º
Base ÆÄ±«
ÀÌ·¸°Ô µÇ¸é Derived°¡ ÇÒ´çÇÑ 32¹ÙÀÌÆ®´Â ȸ¼ö ºÒ°¡´ÉÇÏ´Ù. ¸Þ¸ð¸®¸¸ Á¶±Ý ÀÒ¾î¹ö¸°´Ù¸é¾ß ½É°¢ÇÑ Á¤µµ´Â ¾Æ´ÏÁö¸¸ Çϵå¿þ¾î ȯ°æ º¯°æ, ³×Æ®¿öÅ© ¿¬°á, ½º·¹µå »ý¼º µîÀÇ ´õ Áß¿äÇÑ ÀÏÀ» Çß´Ù¸é Ä¡¸íÀûÀÎ °á°ú¸¦ ÃÊ·¡ÇÒ ¼öµµ ÀÖ´Ù. ¹®Á¦°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë¾ÒÀ¸¹Ç·Î ÇØ°áÇÏ´Â °ÍÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. ÆÄ±«ÀÚ°¡ µ¿Àû °áÇÕÀ» Çϵµ·Ï °¡»ó ÇÔ¼ö·Î ¸¸µé¸é µÈ´Ù. Base¿¡¸¸ virtualÀ» ºÙ¿©µµ µÇÁö¸¸ °¡±ÞÀûÀÌ¸é µÑ ´Ù ºÙÀÌ´Â °ÍÀÌ ÁÁ´Ù.
virtual ~Base() { delete [] B_buf;puts("Base ÆÄ±«"); }
....
virtual ~Derived() { delete [] D_buf;puts("Derived ÆÄ±«"); }
ÀÌ·± ÀÌÀ¯·Î ±â¹Ý Ŭ·¡½º·Î »ç¿ëµÉ °¡´É¼ºÀÌ Àִ Ŭ·¡½ºÀÇ ÆÄ±«ÀÚ´Â Ç×»ó °¡»ó ÇÔ¼ö·Î ¼±¾ðÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð ÆÄ±«ÀÚ¿¡¼ Ưº°ÇÑ Á¤¸® ÀÛ¾÷À» ÇÒ Çʿ䰡 ¾ø´Ù°Å³ª ÆÄ»ýµÇÁö ¾Ê´Â Ŭ·¡½º¶ó¸é ±»ÀÌ ´À¸° °¡»ó ÆÄ±«ÀÚ¸¦ ¾²Áö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ÇÏÁö¸¸ ´çÀåÀº ÇÊ¿äÄ¡ ¾Ê´Ù ÇÏ´õ¶óµµ Ŭ·¡½º¶õ ¾ðÁ¦µçÁö È®ÀåµÉ ¼ö ÀÖ°í ´©°¡ ¾ðÁ¦ ÀÌ Å¬·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ»Áö ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ °¡±ÞÀûÀÌ¸é ÆÄ±«ÀÚ´Â °¡»óÀ¸·Î ¼±¾ðÇØ µÎ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù. ±×·¡¾ß Æ÷ÀÎÅͷκÎÅÍ »èÁ¦Çصµ ±ú²ýÇÏ°Ô »èÁ¦µÇ¸ç ¾ðÁ¦µçÁö Ŭ·¡½º¸¦ ¾È½ÉÇϰí È®ÀåÇÒ ¼ö ÀÖ´Ù.
¾Õ Àå¿¡¼ ¸¸µé¾ú´ø Person Ŭ·¡½ºµµ µ¿Àû ÇÒ´çÀ» »ç¿ëÇϹǷΠÀÌ Å¬·¡½ºÀÇ ÆÄ±«ÀÚµµ ´ç¿¬È÷ °¡»óÀ̾î¾ß ÇÏ¸ç »ó¼ÓÀ» °í·ÁÇÏ¿© private´Â protected·Î ¹Ù²Ù´Â °ÍÀÌ ÁÁ´Ù. ´çÀåÀº PersonÀÌ È¦·Î ¾²ÀÌ´õ¶óµµ ¾ðÁ¦ ÀÌ Å¬·¡½º·ÎºÎÅÍ Boy, Girl µûÀ§ÀÇ Å¬·¡½º°¡ ÆÄ»ýµÉÁö ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÆÄ±«ÀÚ¿¡ ºñÇØ »ý¼ºÀÚ´Â °¡»óÀÌ ¾Æ´Ï¾îµµ »ó°ü¾øÀ¸¸ç °¡»óÀ¸·Î ¼±¾ðÇÒ ¼öµµ ¾ø´Ù. ¿Ö³ÄÇÏ¸é °´Ã¼¸¦ »ý¼ºÇÒ ¶§´Â °´Ã¼ÀÇ Å¸ÀÔÀ» ºÐ¸íÈ÷ ¸í½ÃÇϹǷΠ¾î¶² »ý¼ºÀÚ°¡ È£ÃâµÉÁö Á¤È®ÇÏ°Ô °áÁ¤ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. Person3 ¿¹Á¦ÀÇ ÆÄ±«ÀÚ¸¦ °¡»óÀ¸·Î ¼±¾ðÇϵµ·Ï ÇÏÀÚ.
virtual ~Person() {
delete [] Name;
}
±×¸®°í ÆÄ»ý Ŭ·¡½º¿¡¼ Name, Age¸¦ ÀÐÀ» ¼ö ÀÖµµ·Ï protected·Î ¾×¼¼½º ÁöÁ¤À» º¯°æÇÑ´Ù. ÀÌÁ¦ µåµð¾î Person Ŭ·¡½º°¡ ¿Ïº®ÇØÁ³´Ù. »ý¼ºÀÚ, ÆÄ±«ÀÚ¿¡¼ µ¿Àû ¹öÆÛ¸¦ Àß °ü¸®Çϰí ÀÖÀ¸¸ç º¹»ç »ý¼º, ´ëÀÔ ¿¬»ê¿¡ ´ëÇØ¼µµ ¾ÈÀüÇÏ°Ô »çº»À» ÀÛ¼ºÇÏ¸ç »ó¼Ó °ü°è¿¡¼ »ç¿ëµÉ ¼öµµ ÀÖ´Ù. Person Ŭ·¡½º¸¦ Á¦´ë·Î ¸¸µé±â À§ÇØ ±²ÀåÈ÷ ±ä ½Ç½À °úÁ¤À» °ÅÃÆ´Âµ¥ ÀÌ Å¬·¡½º È®Àå °úÁ¤Àº C++ Çʼö ¹®¹ýÀ» ¸ðµÎ Æ÷ÇÔÇϹǷΠÇÑ ¹øÂë ÃÑ Á¤¸®¸¦ ÇØ µÎ´Â °ÍÀÌ ÁÁ´Ù.