[C++]°­ÁÂ(32)<--´ÙÁß»ó¼Ó





44Çà¿¡¼­ ´ÙÁß »ó¼ÓµÈ Messcir Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í Àִµ¥ Ŭ·¡½º °èÃþµµ¿¡¼­
º¸´Ù½ÃÇÇ Circle Ŭ·¡½º¿Í Message Ŭ·¡½º·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ°í ÀÖ´Ù. µû¶ó¼­ Me
sscir Ŭ·¡½º´Â µÎ ±â¹Ý Ŭ·¡½º°¡ °¡Áø ¸â¹ö¸¦ ¸ðµÎ »ó¼Ó¹Þ°Ô µÇ¸ç Ŭ·¡½ºÀÇ
¸ð¾çÀº ´ëÃæ ´ÙÀ½°ú °°ÀÌ µÉ °ÍÀÌ´Ù.

                    ¦£¦¡¦¡¦¡¦¡¦¤
                ¦£¦¡¦¢  px    ¦¢
Circle·ÎºÎÅÍ     ¦¢  ¦¢  py    ¦¢
  »ó¼Ó ¹ÞÀ½     ¦¢  ¦¢  Color ¦¢
                ¦¦¦¡¦¢  Rad   ¦¢
                    ¦¢  px    ¦¢ ¦¡¦¤  Message·ÎºÎÅÍ
                    ¦¢  py    ¦¢   ¦¢    »ó¼Ó ¹ÞÀ½
                    ¦¢  msg   ¦¢ ¦¡¦¥
                    ¦¢        ¦¢
                    ¦¢        ¦¢
                    ¦¦¦¡¦¡¦¡¦¡¦¥

¸ðµÎ 7°³ÀÇ µ¥ÀÌÅÍ ¸â¹ö¸¦ °¡Áö¸ç sizeof(Messcir)Àº 7*2=14°¡ µÈ´Ù. ¿©±â¼­
px, py ¸â¹ö°¡ µÎ ¹ø Áߺ¹µÇ¾î Àִµ¥ ±× ÀÌÀ¯´Â root Ŭ·¡½ºÀÎ PositionÀ¸·Î
ºÎÅÍ »ó¼Ó¹ÞÀº µÎ °³ÀÇ Å¬·¡½º·ÎºÎÅÍ ´Ù½Ã ´ÙÁß »ó¼ÓÀ» ¹Þ¾Ò±â ¶§¹®ÀÌ´Ù. ÀÌ
¹®Á¦´Â µû·Î ÇØ°áÃ¥ÀÌ ÀÖ´Ù. ¾î·µç Messcir Ŭ·¡½º´Â ¿øÀ» Ç¥ÇöÇÒ ¼ö ÀÖ´Â ´É
·Â°ú ÇÔ²² ¿ø °¡¿îµ¥¿¡ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ´Â ´É·ÂÀ» µ¿½Ã¿¡ °¡Áö°Ô µÇ¾ú´Ù.
main ÇÔ¼öÀÇ 73Çà¿¡¼­ MesscirÇüÀÇ °´Ã¼ MC1À» »ý¼ºÇÏ°í 74Çà¿¡¼­ »ý¼ºÇÑ °´
ü¸¦ Ãâ·ÂÇÏ¿´´Ù. 75,76Ç൵ ¸¶Âù°¡ÁöÀÇ ±¸Á¶ÀÌ´Ù. ¿¹»óÇÏ°ÚÁö¸¸ ´ÙÁß »ó¼ÓÀº
»ý¼ºÀÚÀÇ µ¿ÀÛÀÌ »ó´çÈ÷ º¹ÀâÇÏ´Ù. ±×·² ¼ö¹Û¿¡ ¾ø´Â °ÍÀÌ µÎ°³ÀÇ Å¬·¡½º·ÎºÎ
ÅÍ »ó¼Ó¹Þ¾Ò±â ¶§¹®¿¡ »ý¼ºÀÚ³¢¸® Àμö¸¦ ¼­·Î ³ª´©¾î °¡Áö°í ¼­·Î ±â¹Ý Ŭ·¡
½º¸¦ È£ÃâÇØ´ë±â ¶§¹®ÀÌ´Ù.
°Ô´Ù°¡ px, py´Â Circle Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿Í Message Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡°Ô µ¿
½Ã¿¡ Àü´ÞµÇ±â±îÁö ÇÑ´Ù. ´ÙÀ½¿¡ 72ÇàÀÇ »ý¼ºÀÚ È£Ãâ °á°ú »ý¼ºÀÚ³¢¸® ¾î¶»°Ô
È£ÃâµÇ´ÂÁö¸¦ ±×·Áº¸¾Ò´Ù. ½Ç¼±Àº Àμö°¡ ´Ù¸¥ »ý¼ºÀÚ·Î ³Ñ°ÜÁö´Â °ÍÀ» ÀǹÌÇÏ
°í Á¡¼±Àº µ¥ÀÌÅÍ ¸â¹ö°¡ Á¤ÀǵǴ °ÍÀ» ¶æÇÑ´Ù. º¹ÀâÇغ¸ÀÌÁö¸¸ ´ÜÀÏ »ó¼ÓÀÇ
»ý¼ºÀÚ È£ÃâÀ» ÀÌÇØÇÏ°í ÀÖ´Ù¸é ÀÌ Á¤µµ¾ß »ç½Ç º°°Íµµ ¾Æ´Ï´Ù.

*) ±×¸² »ý·«:º¹ÀâÇϱ⠶§¹®¿¡ Á÷Á¢ ±×¸± ¼ö ¾øÀ¾´Ï´Ù.

»ý¼ºÀÚ È£Ãâ Çѹø¿¡ ¹«·Á 5¹øÀÇ ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ È£ÃâÀÌ ÀÌ·ç¾îÁø´Ù. ±â
¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ È£Ãâ ¼ø¼­´Â ¸ÕÀú µîÀåÇÑ ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ ¸ÕÀú È£
ÃâµÈ´Ù. Messcir Ŭ·¡½º ¼±¾ð¹®¿¡¼­ ±â¹Ý Ŭ·¡½º ÀÚ¸®¿¡ Circle Ŭ·¡½º°¡ ¸ÕÀú
³ªÅ¸³µÀ¸¹Ç·Î Circle Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ È£ÃâµÇ°í ³­ ÈÄ¿¡ Message Ŭ·¡½ºÀÇ
»ý¼ºÀÚ°¡ È£ÃâµÈ´Ù.

class Messcir:public Circle,public Message

¸¸¾à Messcir Ŭ·¡½ºÀÇ ¼±¾ðÀ» ´ÙÀ½°ú °°ÀÌ ¹Ù²Ù¸é »ý¼ºÀÚÀÇ È£Ãâ ¼ø¼­´Â ¹Ý
´ë·Î Message Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ ¸ÕÀú È£ÃâµÇ°í Circle Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ È£
ÃâµÉ °ÍÀÌ´Ù.

class Messcir:public Message,public Circle

ÀÌ ¿¹Á¦¿¡¼­´Â ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼­ ÇÏ´Â ÀÏÀÌ µ¥ÀÌÅÍ ¸â¹ö¸¦ ÃʱâÈ­½Ã
Å°´Â ÀϹۿ¡ ¾øÀ¸¹Ç·Î ¼ø¼­°¡ ±×´ÙÁö Áß¿äÇÏÁö ¾ÊÁö¸¸ °æ¿ì¿¡ µû¶ó¼­´Â ¾î¶²
±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ ¸ÕÀú È£ÃâµÇ´Â°¡°¡ Áß¿äÇÑ °æ¿ìµµ ÀÖ´Ù. À̶§´Â ¸ÕÀú
È£ÃâµÇ¾î¾ß ÇÒ ±â¹Ý Ŭ·¡½º¸¦ ¹Ýµå½Ã ¸ÕÀú Àû¾î ÁÖ¾î¾ß ÇÑ´Ù. Æı«ÀÚ´Â »ý¼ºÀÚ
¿Í´Â ¹Ý´ë·Î ¸ÕÀú µîÀåÇÑ Å¬·¡½ºÀÇ Æı«ÀÚ°¡ µÚ¿¡ ½ÇÇàµÈ´Ù.


´Ù. °¡»ó ±â¹Ý Ŭ·¡½º

¿©±â¼­´Â ´ÙÁß »ó¼ÓÀ¸·Î ÀÎÇØ ¹ß»ýÇÏ´Â ¹®Á¦Á¡°ú ±× ÇØ°áÃ¥À» ¾Ë¾Æº¸±â·Î ÇÑ
´Ù. ´ÙÁß »ó¼Ó ÀÚü°¡ Á¶±Ý º¹ÀâÇϱ⠶§¹®¿¡ ´ÙÁß »ó¼ÓÀ¸·Î ÀÎÇÑ ºÎÀÛ¿ëÀÌ ¾Æ
¹«·¡µµ ¹ß»ýÇÒ ¼ö¹Û¿¡ ¾øÀ¸¸ç µû¶ó¼­ ºÎÀÛ¿ëÀ» ÇØ°áÇϱâ À§ÇÑ ¹æ¹ýÀÌ ¿ä±¸µÈ´Ù.
C++Àº ´ÙÁß »ó¼ÓÀ» Áö¿øÇÏÁö¸¸ ÇÑ Å¬·¡½º¸¦ µÎ ¹ø »ó¼ÓÇÏ´Â °ÍÀº Çã¿ëÇÏÁö ¾Ê
´Â´Ù. ¾î¶² °æ¿ìÀΰ¡ ÇÏ¸é ´ÙÀ½°ú °°Àº °æ¿ìÀÌ´Ù.

class A { ... };
class B : public A,public A { ... };

Çã¿ëÇÏÁö ¾Ê´Â´Ù±â º¸´Ù´Â Â÷¶ó¸® Çã¿ëÀ»  ÇÒ ÇÊ¿ä°¡ ¾ø´Ù°í ÇØ¾ß ¿ÇÀ» °Í °°
´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô Á÷Á¢ÀûÀ¸·Î ÇÑ Å¬·¡½º¸¦ µÎ ¹ø »ó¼Ó¹ÞÀ» ¼ö´Â ¾ø¾îµµ °£Á¢
ÀûÀ¸·Î ÇÑ Å¬·¡½º¸¦ µÎ ¹ø »ó¼Ó¹ÞÀ» ¼ö´Â ÀÖ´Ù.

class A { ... };
class B :public A { ... };
class C :public A { ... };
class D :public B,public C { ... };

Ŭ·¡½º B¿Í Ŭ·¡½º C°¡ Ŭ·¡½º A¸¦ »ó¼Ó¹Þ¾Æ ¸¸µé¾îÁø Ŭ·¡½ºÀ̸ç Ŭ·¡½º D´Â
B¿Í C·ÎºÎÅÍ ´ÙÁß »ó¼ÓÀ» ¹Þ¾Æ ¸¸µé¾îÁø Ŭ·¡½ºÀÌ´Ù. Ŭ·¡½º D´Â °£Á¢ÀûÀ¸·Î
Ŭ·¡½º A¸¦ µÎ ¹ø »ó¼Ó¹Þ´Â °á°ú°¡ µÇ¾úÀ¸¸ç ÀÌ·± »ó¼ÓÀº Çã¿ëÀ» ÇÑ´Ù. ¾Õ¿¡¼­
¿ì¸®°¡ ¸¸µé¾ú´ø ´ÙÁß »ó¼Ó Ŭ·¡½ºÀÎ Messcir Ŭ·¡½º°¡ ÀÌ·± °æ¿ì¿¡ ÇØ´çÇϸç
°£Á¢ÀûÀ¸·Î Position Ŭ·¡½º¸¦ µÎ ¹ø »ó¼Ó¹Þ¾Ò´Ù. ÀÌ °æ¿ì¿¡ ¹ß»ýÇÏ´Â ¹®Á¦Á¡
Àº °£Á¢ÀûÀ¸·Î µÎ ¹ø »ó¼ÓµÈ Ŭ·¡½ºÀÇ µ¥ÀÌÅÍ ¸â¹ö°¡ µÎ ¹ø °ãÃļ­ Áߺ¹µÇ¾î
»ó¼ÓµÈ´Ù´Â Á¡ÀÌ´Ù. ¹®Á¦¸¦ Á»´õ ´Ü¼øÈ­Çϱâ À§ÇØ °£´ÜÇÑ »ó¼Ó ¸ðµ¨À» ¸¸µé¾î
º¸ÀÚ.

class classA {
 private:
   int dataA;
 };
class classB:public classA {
 private:
   int dataB;
 };
class classC:public classA {
 private:
   int dataC;
 };
class classD:public classB,public classC {
 private:
   int dataD;
 };

classA¸¦ »ó¼Ó¹ÞÀº µÎ Ŭ·¡½º·ÎºÎÅÍ ´ÙÁß »ó¼ÓÀ» ¹ÞÀº classD°¡ °¡Áö°Ô µÇ´Â
µ¥ÀÌÅÍ ¸â¹ö¸¦ »ìÆ캸ÀÚ.

*)±×¸² »ý·«

classD´Â classB¿Í classCÀÇ µ¥ÀÌÅÍ ¸â¹ö¸¦ ¸ù¶¥ ´Ù »ó¼Ó¹Þ±â ¶§¹®¿¡ dataA¸¦
µÎ ¹ø Áߺ¹Çؼ­ »ó¼ÓÀ» ¹Þ°Ô µÈ´Ù. °°Àº µ¥ÀÌÅÍ ¸â¹ö¸¦ µû·Î ÀúÀåÇÔÀ¸·Î½á ±â
¾ï Àå¼Ò°¡ ³¶ºñµÈ´Ù. ¶ÇÇÑ °°Àº º¯¼ö¸¦ µÎ °³ °¡ÁüÀ¸·Î Çؼ­ ¿©·¯ °¡Áö ¹®Á¦°¡
¹ß»ýÇÒ ¼ÒÁöµµ °¡Áö°í ÀÖ´Ù. ¸¸¾à classDÀÇ °´Ã¼ objectDÀÇ ¸â¹öÀÎ dataA¿¡ ¾î
¶² °ªÀ» ´ëÀÔÇÏ´Â objectD.dataA=3; °ú °°Àº ´ëÀÔ½ÄÀÌ ÀÖÀ» ¶§ dataA°¡ °ú¿¬
µÑ Áß ¾î¶² ¸â¹ö¸¦ ¸»ÇÏ´ÂÁö ¾Ö¸ÅÇØÁ® ¹ö¸®°Ô µÇ¸ç Member is ambiguous ¿¡·¯
°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ¾Õ¿¡¼­ ¿ì¸®°¡ ¸¸µé¾ú´ø Messcir Ŭ·¡½º¿¡¼­ ÀÌ·± ¹®Á¦°¡
¹ß»ýÇßÀ¸¸ç Position Ŭ·¡½ºÀÇ µ¥ÀÌÅÍ ¸â¹öÀÎ px, py¸¦ µÎ ¹ø »ó¼Ó¹Þ¾Ò¾ú´Ù.
ÇÏÁö¸¸ Messcir Ŭ·¡½º ¿¹Á¦¿¡¼­ ÀüÇô ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´Âµ¥ ±× ÀÌÀ¯´Â px
, py¸¦ Messcir Ŭ·¡½º¿¡¼­ Á÷Á¢ °Çµå¸®´Â ÀÏÀÌ ¾ø±â ¶§¹®ÀÌ´Ù.
px, py¸¦ ÃʱâÈ­ÇÏ´Â ºÎºÐÀº ±â¹Ý Ŭ·¡½ºÀÎ Circle Ŭ·¡½º¿Í Position Ŭ·¡½º
ÀÇ »ý¼ºÀÚ¿¡ ¶° ³Ñ±â°í ÀÖ´Ù. ±â¹Ý Ŭ·¡½º¿¡¼­´Â px, py°¡ Áߺ¹µÇ¾î ÀÖÁö ¾ÊÀ¸
¹Ç·Î ¾î¶² px, py¸¦ ¸»ÇÏ´ÂÁö ¸íÈ®ÇÏ°Ô ±¸ºÐÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ¿ø°ú ¸Þ½ÃÁö¸¦
Ãâ·ÂÇÏ´Â Messcir::Show ÇÔ¼ö¿¡¼­µµ px, py¸¦ Á÷Á¢ »ç¿ëÇÏÁö ¾Ê°í ±â¹Ý Ŭ·¡½º
ÀÇ Show ÇÔ¼ö¸¦ Â÷·Ê·Î È£ÃâÇÏ¿´´Ù. ¸¸¾à Messcir::Show() ÇÔ¼ö ³»ºÎ¿¡¼­ px³ª
py¸¦ ÂüÁ¶ÇÏ¸é ´çÀå ¾î¶² ¸â¹ö¸¦ ¸»Çϴ°ÇÁö¸¦ ±¸ºÐÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ¿¡·¯°¡
¹ß»ýÇÏ°Ô µÈ´Ù.
±×·¯³ª Áߺ¹ »ó¼ÓµÈ µ¥ÀÌÅÍ ¸â¹ö°¡ °¢°¢ ´Ù¸¥ Àǹ̸¦ °¡Áö°í ÀÖ´Ù¸é ±×°ÍÀº
³ª¸§´ë·ÎÀÇ Àǹ̰¡ ÀÖ´Ù. Messcir Ŭ·¡½º¿¡¼­ ¿øÀÇ Áß½ÉÁ¡À» ³ªÅ¸³»´Â px, py
¿Í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ px, pyÀÇ ÁÂÇ¥¸¦ °¢°¢ ´Ù¸£°Ô ÁöÁ¤À» ÇÑ´Ù¸é µÎ ½ÖÀÇ px,
py´Â °³º°ÀûÀ¸·Î Á¸ÀçÇÒ °¡Ä¡°¡ ÀÖ´Ù. ±×·¯³ª ÀÌ·± °æ¿ì´Â ¹«Ã´ µå¹® ÀÏÀ̸ç
´ë°³ÀÇ °æ¿ì´Â µ¥ÀÌÅÍ ¸â¹ö¸¦ Áߺ¹ »ó¼Ó¹Þ´Â °æ¿ì ¸¹Àº ¹®Á¦¸¦ ¾ß±â½ÃÅ°°Ô µÈ
´Ù.
ÀÌ·± µ¥ÀÌÅÍ ¸â¹öÀÇ Áߺ¹ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ C++Àº °¡»ó ±â¹Ý Ŭ·¡½º(vi
rtual base class)¸¦ Áö¿øÇÑ´Ù. °¡»ó ±â¹Ý Ŭ·¡½º·Î ÁöÁ¤µÈ Ŭ·¡½º´Â °£Á¢Àû
Áߺ¹¿¡ ÀÇÇØ µÎ ¹ø »ó¼ÓÀÌ µÉ °æ¿ì´Â Áߺ¹µÇ´Â µ¥ÀÌÅÍ ¸â¹ö¸¦ ÇÕÃÄ Çϳª¸¸ »ó
¼ÓµÇµµ·Ï ÇÑ´Ù. °¡»ó ±â¹Ý Ŭ·¡½º·Î ÁöÁ¤Çϱâ À§Çؼ­´Â ÆÄ»ý Ŭ·¡½º Á¤Àǹ®¿¡
¼­ ±â¹Ý Ŭ·¡½ºÀÇ À̸§ ¾Õ¿¡ virtual Å°¿öµå¸¦ »ðÀÔÇØÁÖ¸é µÈ´Ù.

class classA {
 private:
   int dataA;
 };
class classB:virtual public classA {
 private:
   int dataB;
 };
class classC:virtual public classA {
 private:
   int dataC;
 };
class classD:public classB,public classC {
 private:
   int dataD;
 };

classB¿Í classC°¡ ¼±¾ðµÉ ¶§ ±â¹Ý Ŭ·¡½ºÀÎ classA°¡ °¡»ó ±â¹Ý Ŭ·¡½º°¡ µÇ
¾úÀ¸¹Ç·Î ÀÌÈÄ classB¿Í classC·ÎºÎÅÍ ´ÙÁß »ó¼ÓÀ» ¹Þ´Â Ŭ·¡½º°¡ ÀÖÀ¸¸é clas
sAÀÇ µ¥ÀÌÅÍ ¸â¹ö´Â Çѹø¸¸ »ó¼ÓµÈ´Ù.

*)±×¸² »ý·«


À̾ °è¼ÓµË´Ï´Ù. ==============>>>>>>>


--------------------------------------------------------------------------------