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

¾Õ Ç׿¡¼­ ´ÙÁß »ó¼ÓÀ¸·Î ÀÎÇÑ ¹®Á¦Á¡µé¿¡ ´ëÇØ ¾Ë¾Æ ºÃ´Âµ¥ ¿ä¾àÇÏÀÚ¸é ÇÑ Å¬·¡½º¸¦ °£Á¢ÀûÀ¸·Î µÎ ¹ø »ó¼Ó¹ÞÀ» °æ¿ì ÀÌ Å¬·¡½ºÀÇ ¸â¹ö°¡ Áߺ¹µÇ¾î ¸Þ¸ð¸®°¡ ³¶ºñµÇ°í ¾î¶² ¸â¹ö¸¦ ĪÇÏ´ÂÁö ¾Ë ¼ö ¾ø´Â ¸ðÈ£ÇÔÀÌ ¹ß»ýÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ÇÑ Å¬·¡½º¸¦ µÎ ¹ø »ó¼Ó¹Þ´õ¶óµµ ÀÌ Å¬·¡½ºÀÇ ¸â¹öµéÀº ÇÑ ¹ø¸¸ »ó¼ÓÇϵµ·Ï ÇÏ¸é µÈ´Ù.

ÀÌ·± Ŭ·¡½º¸¦ °¡»ó ±â¹Ý Ŭ·¡½º(Virtual Base Class)¶ó°í Çϴµ¥ ÀÌ·¸°Ô ÁöÁ¤µÈ Ŭ·¡½º´Â °£Á¢ÀûÀ¸·Î µÎ ¹ø »ó¼ÓµÇ´õ¶óµµ °á°ú Ŭ·¡½º¿¡´Â ÀÚ½ÅÀÇ ¸â¹ö¸¦ ÇÑ ¹ø¸¸ »ó¼Ó½ÃŲ´Ù. °¡»ó ±â¹Ý Ŭ·¡½º¸¦ ÁöÁ¤ÇÒ ¶§´Â »ó¼Ó¹®ÀÇ ±â¹Ý Ŭ·¡½º¾Õ¿¡ virtualÀ̶ó´Â Å°¿öµå¸¦ ¾´´Ù. virtual Å°¿öµå¿Í »ó¼Ó ¾×¼¼½º ÁöÁ¤ÀÚÀÇ ¼ø¼­´Â ¹«°üÇ쵂 virtualÀ» ¸ÕÀú ÁöÁ¤ÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. VirtualBase1 ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class B : virtual public A

....

 

class C : virtual public A

....

 

class D : public B, public C

{

protected:

     int d;

public:

    D(int aa, int ab, int ac, int ad) : A(aa), B(aa,ab), C(aa,ac) { d=ad; }

 

B¿Í C¸¦ A·ÎºÎÅÍ ÆÄ»ý½Ãų ¶§ A¸¦ °¡»ó ±â¹Ý Ŭ·¡½º·Î ÁöÁ¤Çß´Ù. ¾çÂÊ ´Ù virtual »ó¼ÓÀ» ÇØ¾ß Çϸç ÇÑÂʸ¸ virtual »ó¼ÓÇϸé È¿°ú°¡ ¾ø´Ù. ÀÌ »óÅ¿¡¼­ B¿Í C·ÎºÎÅÍ ´ÙÁß »ó¼ÓÀ» ¹ÞÀ¸¸é AÀÇ ¸â¹ö°¡ ÇÑ ¹ø¸¸ ³ªÅ¸³ª¸ç °á°ú Ŭ·¡½ºÀÎ D¿¡ a ¸â¹ö´Â Çϳª¸¸ Á¸ÀçÇÑ´Ù. ÀÌ·¸°Ô ¼öÁ¤ÇÑ ÈÄ ÄÄÆÄÀÏÇÏ¸é ¸ðÈ£ÇÔÀÌ Á¦°ÅµÇ¾úÀ¸¹Ç·Î DÀÇ ¸â¹ö ÇÔ¼ö¿¡¼­ a¸¦ ¹Ù·Î ÂüÁ¶Çصµ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù.

°¡»ó ±â¹Ý Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹Þ´Â Áß°£ ´Ü°è Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ ÀÚ½ÄÀÇ »ý¼ºÀڷκÎÅÍ È£ÃâµÉ ¶§´Â °¡»ó ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù. À§ ¿¹¿¡¼­ D »ý¼ºÀÚÀÇ ÃʱâÈ­ ¸®½ºÆ®¿¡¼­ B(aa,ab)¸¦ ºÎ¸£´Âµ¥ À̶§ BÀÇ »ý¼ºÀÚ°¡ AÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù´Â ¾ê±â´Ù. ¿Ö³ÄÇϸé Áß°£ Ŭ·¡½º´Â °¡»ó ±â¹Ý Ŭ·¡½ºÀÇ ¸â¹ö¸¦ Á÷Á¢ ¼ÒÀ¯ÇÏÁö ¾ÊÀ¸¸ç ÃÖÁ¾ Ŭ·¡½º°¡ ÀÌ ¸â¹ö¸¦ ¾î¶² ¿ëµµ·Î »ç¿ëÇÏ´ÂÁöµµ ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.

¶ÇÇÑ µÎ °æ·Î¸¦ ÅëÇØ °¡»ó ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ°¡ °¢°¢ È£ÃâµÇ¸é ¼­·Î °ªÀ» µ¤¾î¾²´Â Ãæµ¹µµ ¹ß»ýÇÑ´Ù. DÀÇ »ý¼ºÀÚ ÃʱâÈ­ ¸®½ºÆ®¿¡¼­ B(aa,ab)¿Í C(aa,ab)¸¦ °¢°¢ È£ÃâÇϴµ¥ ÀÌ µÎ »ý¼ºÀÚ°¡ ¼­·Î AÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇÑ´Ù°í ÇØ º¸ÀÚ. B(1,2), C(3,4)·Î È£ÃâÇß´Ù¸é ÀÌ °æ¿ì a´Â °ú¿¬ ¾î¶² °ªÀ¸·Î ÃʱâÈ­µÇ¾î¾ß ÇÏ´ÂÁö ¾ÆÁÖ ¾Ö¸ÅÇØÁø´Ù. ±×·¡¼­ Áß°£ ´Ü°èÀÇ Å¬·¡½ºµéÀº °¡»ó ±â¹Ý Ŭ·¡½ºÀÇ ¸â¹ö¿¡ ´ëÇÑ ÃʱâÈ­¸¦ ÃÖÁ¾ Ŭ·¡½º¿¡°Ô ¸Ã±â´Â °ÍÀÌ´Ù.

°¡»ó ±â¹Ý Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀº ¸â¹ö´Â ÃÖÁ¾ Ŭ·¡½º°¡ Á÷Á¢ ÃʱâÈ­ÇØ¾ß ÇÑ´Ù. ±×·¡¼­ DÀÇ »ý¼ºÀÚ¿¡¼­ A(aa) È£Ãâ¹®ÀÌ ÇÊ¿äÇÑ °ÍÀÌ´Ù. a ¸â¹ö´Â B¿Í C¸¦ ÅëÇØ »ó¼Ó¹Þ±â´Â ÇßÁö¸¸ ÃÖÁ¾ Ŭ·¡½ºÀÎ DÀÇ °ÍÀ̹ǷΠÀÚ½ÅÀÌ Á÷Á¢ ÃʱâÈ­ÇØ¾ß ÇÑ´Ù. ¸¸¾à DÀÇ »ý¼ºÀÚ°¡ AÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇÏÁö ¾ÊÀ¸¸é À̶§´Â AÀÇ µðÆúÆ® »ý¼ºÀÚ°¡ È£ÃâµÇ¸ç A°¡ µðÆúÆ® »ý¼ºÀÚ¸¦ Á¤ÀÇÇÏÁö ¾Ê´Â´Ù¸é ¿¡·¯·Î 󸮵ȴÙ.

ÆÄ»ý Ŭ·¡½º´Â ¹Ù·Î À§ÀÇ ±â¹Ý Ŭ·¡½º »ý¼ºÀÚ¸¸ È£ÃâÇÒ ¼ö ÀÖÀ¸¸ç ÇҾƹöÁö »ý¼ºÀÚ¸¦ È£ÃâÇÒ ¼ö ¾ø´Ù´Â ±ÔÄ¢ÀÌ ÀÖ´Ù. ±×·¯³ª ´ÙÁß »ó¼ÓÀÇ °æ¿ì´Â ÀÌ ±ÔÄ¢ÀÇ ¿¹¿Ü°¡ ÀÎÁ¤µÇ¾î D°¡ AÀÇ »ý¼ºÀÚ¸¦ ¹Ù·Î È£ÃâÇÒ ¼ö ÀÖ´Ù. º¸´Ù½ÃÇÇ ´ÙÁß »ó¼ÓÀº Á¤±³ÇÑ ¹®¹ý¿¡ ¿¹¿Ü¸¦ µÎ¾î¾ß ÇÒ Á¤µµ·Î º¹ÀâÇÑ ¹®Á¦¸¦ ¾ß±â½ÃŲ´Ù.

´ÙÀ½Àº VirtualBase2 ¿¹Á¦¸¦ ¼öÁ¤ÇØ º¸ÀÚ. CirMessage Ŭ·¡½º°¡ »ó¼Ó¹Þ´Â x, y¸¦ Çϳª·Î ÅëÇÕÇÏ¿© ÀÌ °´Ã¼¸¦ »ý¼ºÇÒ ¶§ ÇϳªÀÇ ÁÂÇ¥·Î ¿øÀÇ Á߽ɰú ¸Þ½ÃÁöÀÇ Ãâ·Â À§Ä¡¸¦ °°ÀÌ ÁöÁ¤Çϵµ·Ï ÇØ º¸ÀÚ. ´ÙÀ½°ú °°ÀÌ »ý¼ºÀÚ¸¸ ¼öÁ¤Çصµ ÀÏ´Ü ¸ñÀûÀ» ÀÌ·ê ¼ö´Â ÀÖ´Ù.

 

CirMessage(int ax, int ay, char ach, int aRad, char *M)

     : Circle(ax,ay,ach,aRad), Message(ax,ay,M) { }

 

»ý¼ºÀÚ·Î ax, ay Àμö¸¦ Çϳª¸¸ Àü´Þ¹Þ¾Æ CircleÀÇ »ý¼ºÀÚ¿Í MessageÀÇ »ý¼ºÀÚ¿¡ ¶È°°Àº °ªÀ» Àü´ÞÇϸé Áߺ¹µÈ ¸â¹ö°¡ °°Àº °ªÀ» °¡Áö¹Ç·Î ¿øÀÇ Áß½ÉÁ¡°ú ¸Þ½ÃÁöÀÇ Ãâ·Â À§Ä¡°¡ °°¾ÆÁú °ÍÀÌ´Ù. ±×·¯³ª ¾ÆÁ÷ x, y ¸â¹ö´Â ¿©ÀüÈ÷ µÎ ¹úÀÌ ÀÖ°í ÀÌ Áߺ¹µÈ ¸â¹ö°¡ ¸Þ¸ð¸®¸¦ Â÷ÁöÇÏ¸ç ¾ðÁ¨°¡´Â ÀáÀçÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å³ °ÍÀÌ´Ù. CirMessage°¡ Coord¸¦ ÇÑ ¹ø¸¸ »ó¼Ó¹Þ±â À§ÇØ Coord°¡ °¡»ó ±â¹Ý Ŭ·¡½º°¡ µÇ¾î¾ß ÇÑ´Ù. ¼Ò½º¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

class Point : virtual public Coord

....

class Circle : public Point

{

protected:

     int Rad;

public:

     Circle(int ax, int ay, char ach, int aRad) : Coord(ax,ay),Point(ax,ay,ach) { Rad=aRad; }

....

class Message : virtual public Coord

....

class CirMessage : public Circle, public Message

{

public:

     CirMessage(int ax, int ay, char ach, int aRad, char *M)

          : Coord(ax,ay),Circle(ax,ay,ach,aRad), Message(ax,ay,M) { }

 

Coord¸¦ Á÷Á¢ »ó¼Ó¹Þ´Â Point, Message Ŭ·¡½ºÀÇ ¼±¾ð¹®¿¡ virtual Å°¿öµå¸¦ »ðÀÔÇÏ°í °£Á¢ÀûÀ¸·Î »ó¼Ó¹Þ´Â Circle, CirMessage Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼­´Â CoordÀÇ »ý¼ºÀÚ¸¦ ¸í½ÃÀûÀ¸·Î È£ÃâÇØ¾ß ÇÑ´Ù. ÀÌ·¸°Ô Çϸé CirMessage´Â Coord¸¦ ÇÑ ¹ø¸¸ »ó¼Ó¹Þ°Ô µÇ¸ç ÀÌ Å¬·¡½ºÀÇ ¸â¹ö ÇÔ¼ö´Â º°´Ù¸¥ ÁöÁ¤¾øÀÌ x, y ¸â¹ö¸¦ ¹Ù·Î ¾×¼¼½ºÇÒ ¼ö ÀÖ´Ù.

°¡»ó »ó¼ÓÀ» ¹ÞÀ¸¸é Áߺ¹µÈ ¸â¹ö°¡ ÇÑ ¹ø¹Û¿¡ ³ªÅ¸³ªÁö ¾ÊÀ¸¹Ç·Î °´Ã¼ÀÇ Å©±â´Â ÁÙ¾îµé¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ ½ÇÁ¦·Î´Â Áߺ¹µÈ ¸â¹öÀÇ °ü¸®¸¦ À§ÇØ ¼û°ÜÁø Æ÷ÀÎÅÍ°¡ Ãß°¡µÇ±â ¶§¹®¿¡ ¹Ýµå½Ã ±×·¸´Ù°í ÇÒ ¼ö´Â ¾ø´Ù. Áߺ¹ ¸â¹öÀÇ °ü¸® ¹æ¹ýÀº ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¥µ¥ ºñÁÖ¾ó C++ÀÇ °æ¿ì °¡»ó ±â¹Ý Ŭ·¡½º Çϳª¿¡ ´ëÇØ 4¹ÙÀÌÆ®¾¿ ´õ Ãß°¡µÇ¸ç Áߺ¹µÈ ¸â¹öÀÇ Å©±â°¡ 4¹ÙÀÌÆ® ÀÌ»óÀÏ ¶§¸¸ °´Ã¼ Å©±â°¡ ÁÙ¾îµç´Ù. °¡»ó ±â¹Ý Ŭ·¡½º°¡ ¹®ÀÚ¿­À̳ª ´ë±Ô¸ð ¹è¿­À» °¡Áú °æ¿ì °´Ã¼ Å©±â´Â ±ØÀûÀ¸·Î ÀÛ¾ÆÁú °ÍÀÌ´Ù.