Protected¸¦ ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±â·Á¸é Å©°Ô
µÎ °¡Áö°¡ ÇÊ¿äÇÏ´Ù. ù°´Â protected¿¡ ´ëÇÑ ±ÇÇÑÀÌ
¾øÀ» ¶§ Á¢±ÙÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ °ÍÀÌ°í ¶Ç Çϳª´Â ¸â¹ö
ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ°Ü¼ ½ÇÇàÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ °ÍÀÌ´Ù.
ù ¹ø°¿¡ ´ëÇÑ À̾߱â´Â ÀÌÀü ÆÁ¿¡¼ ¾ð±ÞµÈ °ÍÀ̱â
¶§¹®¿¡ »ý·«ÇÏ°í µÎ ¹ø°¿¡ ´ëÇÑ °Í¸¸ À̾߱â ÇÏ°Ú´Ù.
ÀϹÝÀûÀ¸·Î C¿¡¼ ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±â±â À§Çؼ´Â
¿Í °°Àº ¹æ¹ýÀ¸·Î ¼±¾ðÇÏ¸é µÇ¾ú´Ù. ±×·±µ¥ classÀÇ
¸â¹ö ÇÔ¼öÀÇ °æ¿ì¿¡´Â Á¶±Ý ´Ù¸¥ ¹®¹ýÀ» »ç¿ëÇØ¾ß Çϴµ¥,
CA¶ó´Â class ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ¹Þ´Â ´ÙÀ½ ´ÙÀ½°ú
°°ÀÌ µÈ´Ù..
¾Õ ÂÊ¿¡ CA¶ó´Â class¸¦ ÀǹÌÇÏ´Â namespace Ç¥½Ã¸¦
Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î ÇØ°áµÇ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çؼ class
¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î º¸³¾ ¼ö°¡ ÀÖÁö¸¸ ÀÌ·¸°Ô ¹ÞÀº
ÆĶó¹ÌÅ͸¦ Á÷Á¢ ½ÇÇàÇÏÁö´Â ¸øÇÑ´Ù. À§¿Í °°Àº
¼±¾ðÀ̶ó¸é ´Ü¼øÇÑ ÆĶó¹ÌÅÍÀÏ»ÓÀÌÁö ½ÇÇà °¡´ÉÇÑ ÇÔ¼ö
ÇüŶó°í´Â º¼ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. (ÇÏÁö¸¸ C ÇüÅÂÀÇ
ÇÔ¼ö ÆĶó¹ÌÅÍ´Â ½ÇÇà±îÁö °¡´ÉÇÏ´Ù) ±× ÀÌÀ¯´Â class
¸â¹ö ÇÔ¼ö´Â ¾Ï¹¬ÀûÀ¸·Î this¸¦ Æ÷ÇÔÇÏ¿©¾ß Çϱ⠶§¹®¿¡
½º½º·Î ½ÇÇàÀº ºÒ°¡´É ÇÑ °ÍÀÌ´Ù. ±×·¸´Ù¸é °á±¹ this°¡
µÇ´Â class ÀνºÅϽºµµ ³Ñ°Ü ÁÖ¾î¾ß Çϱ⠶§¹®¿¡ ´ÙÀ½°ú
°°Àº ÇüÅ°¡ µÇ¾î¾ß ÇÑ´Ù.
void Print(CA* pThis, void (CA::*fnPrint)(const char*))
À̷μ this¿Í class ¸â¹ö º¯¼ö°¡ ¸ðµÎ Àü´Þ µÇ¾ú´Ù.
ÇÏÁö¸¸ ÇϳªÀÇ ³°üÀÌ ´õ ³²¾Æ ÀÖ´Ù. ÀÌ 2°³ÀÇ ÆĶó¹ÌÅ͸¦
¾î¶»°Ô Á¶ÇÕÇÏ´À³Ä´Â °ÍÀÌ ¹®Á¦ÀÌ´Ù. ±× ¹æ¹ýµµ CÀÇ
°æ¿ì¸¦ Á¶±Ý ÀÀ¿ëÇØ º¸¸é °á·ÐÀÌ ³ª¿À´Âµ¥ ´ÙÀ½°ú °°ÀÌ
ÇÏ¸é µÈ´Ù.
ÀÌ Àüü¸¦ Å×½ºÆ® Çϱâ À§Çؼ ´ÙÀ½ÀÇ test case¸¦
¸¸µé¾î º¸¾Ò´Ù.
01: #include <iostream>
02:
03: class CA
04: {
05: int m_data;
06:
07: protected:
08: void _Print(const char* szText)
09: {
10: std::cout << szText << "(" << m_data << ")" << std::endl;
11: }
12: public:
13: CA(int data): m_data(data) {};
14: };
15:
16: /////////////////////////////////////////////////////////
17: // ÆĶó¹ÌÅÍ·Î ¹ÞÀº this¿Í ¸â¹ö ÇÔ¼ö¸¦ Á¶ÇÕÇÑ´Ù
18: void PrintProxy(CA* pThis, void (CA::*_Print)(const char*), const char* szText)
19: {
20: (pThis->*_Print)(szText);
21: };
22:
23: /////////////////////////////////////////////////////////
24: // ÆĶó¹ÌÅÍ·Î ¹ÞÀº thisÀÇ protected ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±ä´Ù.
25: void PrintProxy(CA* pThis, const char* szText)
26: {
27: class CB: public CA
28: {
29: public:
30: CB(int data): CA(data) {};
31: void Print(const char* szText)
32: {
33: PrintProxy(this, &CB::_Print, szText);
34: }
35: };
36:
37: static_cast<CB*>(pThis)->Print(szText);
38:
}
39:
40: /////////////////////////////////////////////////////////
41: // TEST CASE
42: int main(void)
43: {
44: CA a(100);
45:
46: // aÀÇ protected ÇÔ¼öÀÎ _Print()¸¦ ÀÌ¿ëÇØ ¹®ÀÚ¸¦ Ãâ·Â
47: PrintProxy(&a, "my message");
48:
49: return 0;
50: }
|