ÀÌ Ä³½ºÆ® ¿¬»êÀÚ´Â Æ÷ÀÎÅͳ¢¸® ¶Ç´Â ·¹ÆÛ·±½º³¢¸® º¯È¯Çϴµ¥ ¹Ýµå½Ã Æ÷ÀÎÅÍ´Â Æ÷ÀÎÅÍ·Î º¯È¯ÇØ¾ß ÇÏ°í ·¹ÆÛ·±½º´Â ·¹ÆÛ·±½º·Î º¯È¯ÇØ¾ß ÇÑ´Ù. Æ÷ÀÎÅ͸¦ ·¹ÆÛ·±½º·Î ¹Ù²Ù°Å³ª ·¹ÆÛ·±½º¸¦ Æ÷ÀÎÅÍ·Î º¯È¯ÇÏ´Â °ÍÀº »ó½ÄÀûÀ¸·Î ÇÊ¿äÇÏÁöµµ ¾Ê°í °¡´ÉÇÏÁöµµ ¾Ê´Ù. Æ÷ÀÎÅͳ¢¸® º¯È¯ÇÒ ¶§µµ ¹Ýµå½Ã »ó¼Ó °èÃþ¿¡ ¼ÓÇÑ Å¬·¡½º³¢¸®¸¸ º¯È¯ÇÒ ¼ö ÀÖ´Ù. int *¸¦ char *·Î º¯È¯Çϰųª Parent *¸¦ int *·Î º¯È¯ÇÏ´Â °ÍÀº ¾ÈµÈ´Ù.
ºÎ¸ð Àڽİ£À» º¯È¯ÇÒ ¶§ ¾÷ ij½ºÆÃÀº ¿ø·¡ºÎÅÍ Çã¿ëµÇ´Â °ÍÀ̹ǷΠÀÌ Ä³½ºÆ® ¿¬»êÀÚ°¡ ÀÖÀ¸³ª ¾øÀ¸³ª ´ç¿¬È÷ °¡´ÉÇÏ´Ù. ¹®Á¦´Â ºÎ¸ð ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ÀÚ½Ä Å¸ÀÔÀÇ Æ÷ÀÎÅÍ·Î ´Ù¿î ij½ºÆÃÇÒ ¶§Àε¥ À̶§´Â ¹«Á¶°Ç º¯È¯À» Çã¿ëÇÏÁö ¾Ê°í ¾ÈÀüÇÏ´Ù°í ÆÇ´ÜµÉ ¶§¸¸ Çã¿ëÇÑ´Ù. ¾ÈÀüÇÑ °æ¿ì¶õ º¯È¯ ´ë»ó Æ÷ÀÎÅͰ¡ ºÎ¸ð Ŭ·¡½ºÇü Æ÷ÀÎÅÍ Å¸ÀÔÀÌµÇ ½ÇÁ¦·Î ÀÚ½Ä °´Ã¼¸¦ °¡¸®Å°°í ÀÖÀ» ¶§ ÀÚ½Ä Å¬·¡½ºÇü Æ÷ÀÎÅÍ·Î ´Ù¿î ij½ºÆÃÇÒ ¶§ÀÌ´Ù. ¸»ÀÌ Á» º¹ÀâÇѵ¥ ½ÇÁ¦·Î °¡¸®Å°°í ÀÖ´Â °´Ã¼ÀÇ Å¸ÀÔ´ë·Î ij½ºÆÃÇßÀ¸¹Ç·Î ÀÌ Æ÷ÀÎÅÍ·Î ÀÓÀÇÀÇ ¸â¹ö¸¦ ÂüÁ¶Çصµ Ç×»ó ¾ÈÀüÇÏ´Ù.
¹Ý´ë·Î ºÎ¸ð Ŭ·¡½ºÇü Æ÷ÀÎÅͰ¡ ºÎ¸ð °´Ã¼¸¦ °¡¸®Å°°í ÀÖ´Â »óȲÀÏ ¶§ ÀÚ½Ä Å¬·¡½ºÇüÀ¸·ÎÀÇ ´Ù¿î ij½ºÆÃÀº ¾ÈÀüÇÏÁö ¾ÊÀº º¯È¯ÀÌ´Ù. ¿Ö³ÄÇÏ¸é ºÎ¸ð °´Ã¼¸¦ ´Ù¿î ij½ºÆÃÇØ¼ ÀÚ½Ä °´Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿¡ ´ëÀÔÇÑ ÈÄ ÀÌ Æ÷ÀÎÅÍ·Î ÀڽĿ¡°Ô¸¸ ÀÖ´Â ¸â¹ö¸¦ ÂüÁ¶ÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. dynamic_cast ¿¬»êÀÚ´Â ÀÌ·² °æ¿ì ij½ºÆÃÀ» Çã¿ëÇÏÁö ¾Ê°í NULLÀ» ¸®ÅÏÇÏ¿© À§ÇèÇÑ º¯È¯À» Çã°¡ÇÏÁö ¾Ê´Â´Ù. ±¸Ã¼ÀûÀÎ ¿¹¸¦ µé¾î º¸ÀÚ.
|
¿¹ Á¦ : dynamic_cast |
#include <Turboc.h>
class Parent
{
public:
virtual void PrintMe() { printf("I am Parent\n"); }
};
class Child : public Parent
{
private:
int num;
public:
Child(int anum=1234) : num(anum) { }
virtual void PrintMe() { printf("I am Child\n"); }
void PrintNum() { printf("Hello Child=%d\n",num); }
};
void main()
{
Parent P,*pP,*pP2;
Child C,*pC,*pC2;
pP=&P;
pC=&C;
pP2=dynamic_cast<Parent *>(pC); // ¾÷ ij½ºÆÃ-Ç×»ó ¾ÈÀüÇÏ´Ù.
pC2=dynamic_cast<Child *>(pP2); // ´Ù¿î ij½ºÆÃ-°æ¿ì¿¡ µû¶ó ´Ù¸£´Ù.
printf("pC2 = %p\n",pC2);
pC2=dynamic_cast<Child *>(pP); // ij½ºÆÃ ºÒ°¡´É
printf("pC2 = %p\n",pC2);
}
¾Õ ÀýÀÇ RTTI ¿¹Á¦¿¡¼ »ç¿ëÇß´ø Ŭ·¡½º °èÃþÀ» ±×´ë·Î »ç¿ëÇϱâ·Î ÇÑ´Ù. pP°¡ P°´Ã¼¸¦ °¡¸®Å°°í pC°¡ C°´Ã¼¸¦ °¡¸®Å°°í ÀÖ´Â »óȲÀÌ´Ù. ÀÌ »óÅ¿¡¼ pC¸¦ ¾÷ ij½ºÆÃÇÏ¿© ºÎ¸ð Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î ¹Ù²Ù´Â ¿¬»êÀº Ç×»ó ¾ÈÀüÇѵ¥ pP2·Î ºÎ¸ð¿¡ ¼ÓÇÑ ÀÓÀÇÀÇ ¸â¹ö ÇÔ¼ö¸¦ ºÒ·¯µµ ÀÌ ¸â¹ö´Â pC°¡ °¡¸®Å°´Â C °´Ã¼¿¡ ¼Ò¼ÓµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. µû¶ó¼ ÀÌ ´ëÀÔÀÇ °æ¿ì ij½ºÆ® ¿¬»êÀÚ¸¦ ¾µ Çʿ䵵 ¾øÀÌ pP2=pC·Î ¹Ù·Î ´ëÀÔÇØµµ µÈ´Ù.
´Ù¿î ij½ºÆÃÀÇ °æ¿ì´Â ´ë»ó º¯¼ö°¡ ½ÇÁ¦·Î ¾î¶² °´Ã¼¸¦ °¡¸®Å°´Â°¡¿¡ µû¶ó °¡´ÉÇÒ ¼öµµ ÀÖ°í ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. pP2¸¦ pC2·Î ´Ù¿î ij½ºÆÃÇÏ´Â °æ¿ì¸¦ º¸ÀÚ. À̶§ ¸Þ¸ð¸®ÀÇ »óȲÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù. P °´Ã¼¸¦ pP°¡ °¡¸®Å°°í C °´Ã¼¸¦ pC°¡ °¡¸®Å°´Â »óȲ¿¡¼ pP2°¡ PC¸¦ ¾÷ij½ºÆÃÇßÀ¸¹Ç·Î pP2µµ C¸¦ °°ÀÌ °¡¸®Å°°í ÀÖ´Ù. ÀÌ »óÅ¿¡¼ pC2´Â pP2°¡ °¡¸®Å°°í ÀÖ´Â °´Ã¼ÀÇ ¹øÁö¸¦ ´ëÀÔ¹Þ°í ½Í´Ù°í ÇÏÀÚ.

pP2´Â Parent * ŸÀÔÀ̹ǷΠ¹Ù·Î ´ëÀÔÇÒ ¼ö´Â ¾ø°í Child *·Î ´Ù¿î ij½ºÆÃÇØ¼ ´ëÀÔÇØ¾ß ÇÑ´Ù. À̶§ pP2°¡ °¡¸®Å°´Â ½ÇÁ¦ ´ë»óÀº C°´Ã¼À̹ǷΠij½ºÆÃÇϰíÀÚ Çϴ ŸÀÔ°ú ÀÏÄ¡Çϸç ij½ºÆÃÀº ¼º°øÇÏ¿© pC2°¡ C°´Ã¼ÀÇ ¹øÁö¸¦ °¡¸®Å³ ¼ö ÀÖÀ» °ÍÀÌ´Ù. Child ŸÀÔÀÇ °´Ã¼¸¦ Child *ŸÀÔÀÇ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í ÀÖÀ¸´Ï ´ç¿¬È÷ ¾ÈÀüÇÏ´Ù.
±×·¯³ª µÎ ¹øÂ° °æ¿ì´Â ´Ù¸£´Ù. pP°¡ °¡¸®Å°°í ÀÖ´Â °´Ã¼¸¦ pC2¿¡ ´ëÀÔÇÏ·Á°í ÇÑ´Ù. À̶§µµ ŸÀÔÀÌ ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¹Ç·Î ´Ù¿î ij½ºÆÃÀÌ ÇÊ¿äÇÏ´Ù. pP°¡ °¡¸®Å°´Â ½ÇÁ¦ ´ë»óÀº Child °´Ã¼°¡ ¾Æ´Ï¶ó Parent °´Ã¼À̹ǷΠÀ̶§´Â ´Ù¿î ij½ºÆÃÀ» Çã°¡ÇÒ ¼ö ¾ø´Ù. ¸¸¾à Çã°¡ÇÑ´Ù¸é pC2 Æ÷ÀÎÅÍ·Î PrintNum ÇÔ¼ö¸¦ ºÎ¸¦ °æ¿ì Á¦´ë·Î µÈ °ªÀ» Ãâ·ÂÇÏÁö ¸øÇÒ °ÍÀ̸ç ÀÌ´Â ¾ÕÀÇ ¿¹Á¦¿¡¼µµ È®ÀÎÇØ º» ¹Ù ÀÖ´Ù. ÀÌ·¸°Ô ¾ÈÀüÇÏÁö ¾ÊÀ» °æ¿ì dynamic_cast ¿¬»êÀÚ´Â NULLÀ» ¸®ÅÏÇÏ¿© À߸øµÈ ij½ºÆÃÀÓÀ» ¾Ë¸°´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
pC2 = 0012FF6C
pC2 = 00000000
¾ÈÀüÇÑ °´Ã¼ÀÇ ¹øÁö¿¡ ´ëÇØ¼´Â Á¦´ë·Î ´Ù¿î ij½ºÆÃÀ» ÇÏ°í ±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â ij½ºÆÃÀ» °ÅºÎÇÑ´Ù. static_cast ¿¬»êÀÚ¿Í dynamic_cast ¿¬»êÀÚ´Â »ó¼Ó °ü°è¿¡ Àִ Ŭ·¡½ºµéÀ» ij½ºÆÃÇÑ´Ù´Â Á¡¿¡ ÀÖ¾î¼ ±â´É»ó µ¿ÀÏÇÏ´Ù. ±×·¯³ª ´Ù¿î ij½ºÆÃÀ» ÇÒ ¶§ static_cast´Â ¹«Á¶°Ç º¯È¯À» Çã°¡ÇÏÁö¸¸ dynamic_cast´Â ½ÇÇàÁß¿¡ ŸÀÔÀ» Á¡°ËÇÏ¿© ¾ÈÀüÇÑ Ä³½ºÆÃ¸¸ Çã°¡ÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.
ÀÌ ¿¬»êÀÚ°¡ º¯È¯ °¡´É¼ºÀ» ÆÇ´ÜÇϱâ À§Çؼ´Â ½ÇÇàÁß¿¡ °´Ã¼ÀÇ ½ÇÁ¦ ŸÀÔÀ» ÆÇº°ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼ ÀÌ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ·Á¸é RTTI ¿É¼ÇÀÌ ÄÑÁ® ÀÖ¾î¾ß ÇÏ¸ç º¯È¯ ´ë»ó ŸÀԵ鳢¸®´Â »ó¼Ó °ü°è¿¡ ÀÖ¾î¾ß Çϰí ÃÖ¼ÒÇÑ Çϳª ÀÌ»óÀÇ °¡»ó ÇÔ¼ö¸¦ °¡Á®¾ß ÇÑ´Ù. ¸¸¾à °¡»ó ÇÔ¼ö°¡ ¾ø´Â Ŭ·¡½º °èÃþÀ̶ó¸é ºÎ¸ð ŸÀÔÀÇ Æ÷ÀÎÅÍ¿¡ ÀÚ½Ä °´Ã¼ÀÇ ¹øÁö¸¦ ´ëÀÔÇÒ ÀÏÀÌ ¾øÀ» °ÍÀ̰í ij½ºÆÃµµ ºÒÇÊ¿äÇÒ °ÍÀÌ´Ù.
dynamic_cast ¿¬»êÀÚ´Â Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â ´ë»óÀÌ Ä³½ºÆÃÇϰíÀÚ Çϴ ŸÀÔÀ» °¡¸®Å°°í ÀÖÀ» ¶§¸¸ º¯È¯À» Çã¿ëÇϹǷΠÀÌ ¿¬»êÀÚ·Î º¯È¯ÇÑ Æ÷ÀÎÅÍ´Â ¾ÈÀüÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾ÕÀÇ RTTI ¿¹Á¦¿¡¼ ½ÇÇàÁß Å¸ÀÔÀ» ÆÇº°Çϱâ À§ÇØ typeid ¿¬»êÀÚ¸¦ »ç¿ëÇߴµ¥ ÀÌ ¿¬»êÀÚ ´ë½Å dynamic_cast ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¿¹Á¦ÀÇ func ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.
void func(Parent *p)
{
p->PrintMe();
Child *c=dynamic_cast<Child *>(p);
if (c) {
c->PrintNum();
} else {
puts("ÀÌ °´Ã¼´Â numÀ» °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù.");
}
}
Àμö·Î Àü´ÞµÈ p¸¦ Child *·Î ij½ºÆÃÇ쵂 p°¡ °¡¸®Å°´Â °´Ã¼°¡ Child ŸÀÔÀÏ ¶§¸¸ Á¦´ë·Î º¯È¯µÇ°í ±×·¸Áö ¾ÊÀ» ¶§´Â NULLÀÌ ¸®ÅϵȴÙ. dynamic_cast°¡ ÀÌ º¯È¯À» ¹«»çÈ÷ Çß´Ù¸é pÀÇ ´ë»óü°¡ Child ŸÀÔÀÓÀ» È®½ÇÈ÷ ¾Ë ¼ö ÀÖ°í µû¶ó¼ ÀÌ °´Ã¼·ÎºÎÅÍ PrintNumÀ» ºÒ·¯µµ ¾ÈÀüÇÏ´Ù. ÀÌ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸é ½ÇÇàÁß¿¡ Æ÷ÀÎÅÍÀÇ Å¸ÀÔ Á¡°ËÀ» ÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ij½ºÆÃ±îÁö ÇÒ ¼ö ÀÖÀ¸¹Ç·Î typeid ¿¬»êÀÚº¸´Ù ÈξÀ ´õ Æí¸®ÇÏ´Ù.
ÀÌ ¿¬»êÀÚ´Â ÁÖ·Î »ó¼Ó °ü°è¿¡ ÀÖ´Â Æ÷ÀÎÅ͸¦ ij½ºÆÃÇÒ ¶§ »ç¿ëÇϴµ¥ ·¹ÆÛ·±½º¿¡ ´ëÇØ¼µµ ij½ºÆÃÇÒ ¼ö ÀÖ´Ù. ´Ü ·¹ÆÛ·±½º´Â ¿¡·¯¿¡ ÇØ´çÇÏ´Â NULLÀ» ¸®ÅÏÇÒ ¼ö ¾øÀ¸¹Ç·Î ´ë½Å bad_cast ¿¹¿Ü¸¦ ´øÁø´Ù. µû¶ó¼ ·¹ÆÛ·±½º¸¦ º¯È¯ÇÒ ¶§´Â ¹Ýµå½Ã ij½ºÆÃ Äڵ带 try ºí·Ï¿¡ ÀÛ¼ºÇϰí bad_cast ¿¹¿Ü¸¦ Àâ¾Æ¼ ó¸®ÇØ¾ß ÇÑ´Ù.
´ÙÁß »ó¼Ó °èÃþ¿¡¼ ¾÷, ´Ù¿î ij½ºÆÃÀ» ÇÒ ¶§´Â ¸ðÈ£ÇÑ »óȲÀÌ Á¾Á¾ ¹ú¾îÁö±â ¶§¹®¿¡ Á» ´õ º¹ÀâÇÑ Ä³½ºÆÃ ±ÔÄ¢ÀÌ Àû¿ëµÇ¸ç °¡»ó ±â¹Ý Ŭ·¡½º°¡ ÀÖÀ» ¶§µµ Ưº°ÇÑ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. ¶ÇÇÑ ´ÙÁß »ó¼ÓµÈ ÇÑ °´Ã¼¸¦ °¡¸®Å°´Â ºÎ¸ð Æ÷ÀÎÅ͸¦ ¶Ç ´Ù¸¥ ºÎ¸ð Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î º¯È¯ÇÏ´Â ±³Â÷ ij½ºÆÃ(cross cast)µµ °¡´ÉÇÏ´Ù. ÀÌ·± ±ÔÄ¢¿¡ ´ëÇØ °ü½ÉÀÖÀ¸¸é µû·Î ¿¬±¸ÇØ º¸µÇ ¾îÂ÷ÇÇ ´ÙÁß »ó¼ÓÀÌ ±ÇÀåµÇÁö ¾Ê´Â ¹®¹ýÀ̹ǷΠ¾Ö½á ¹è¿ï °¡Ä¡´Â ¾ø´Ù°í ÇϰڴÙ.