1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// ##########################################
//
// 46 다중 상속에 대한 이해
//
// ##########################################
//
// 다중상속은 문법적 가치가 아주 낮아서 
// 사용을 권장하지 않는다.
// 
//
// 다중 상속의 예
//
#include <iostream>
using std::cout;
using std::endl;

class AAA{
public:
	void String1(){
		cout<<"AAA::String1"<<endl;
	}
};

class BBB{
public:
	void String2(){
		cout<<"BBB::String2"<<endl;
	}
};

class CCC : public AAA, public BBB{
public:
	void ShowString(){
		String1();
		String2();
	}
};

int main(void)
{
	CCC ccc;
	ccc.ShowString();

	return 0;
}

//
// 다중 상속의 모호성
//
#include <iostream>
using std::cout;
using std::endl;

class AAA{
public:
	void String(){
		cout<<"AAA::String"<<endl;
	}
};

class BBB{
public:
	void String(){
		cout<<"BBB::String"<<endl;
	}
};

class CCC : public AAA, public BBB{
public:
	void ShowString(){
		// 아래는 에러 발생
		String();  
		String();  
		// 다음과 같이 에러 해결
		// 그러나 이렇게 사용하는건
		// 코드가 지저분해지는 길..
		// 이래서 다중상속을 하면안된다..
		// AAA::String();
		// BBB::String();
	}
};

int main(void)
{
	CCC ccc;
	ccc.ShowString();

	return 0;
}

//
// virtual base 클래스 예제
//
// BBB, CCC 클래스가 AAA 클래스를 각각 상속하고 있는데
// DDD 클래스가 BBB 클래스와 CCC 클래스를 상속하게되어
// DDD 클래스의 객체 내에는 AAA 클래스를 상속하는
// BBB 클래스와 AAA 클래스를 상속하는 CCC 클래스를 
// 가지게 된다.
// 즉, AAA 클래스가 DDD 클래스속에 중복으로 존재하게 된다.
//
//
#include <iostream>
using std::cout;
using std::endl;

class AAA{
public:
	void String1(){
		cout<<"AAA::String"<<endl;
	}
};

class BBB : public AAA{   // class BBB : virtual public AAA
public:
	void String2(){
		cout<<"BBB::String"<<endl;
	}
};

class CCC : public AAA{  // class CCC : virtual public AAA
public:
	void String3(){
		cout<<"CCC::String"<<endl;
	}
};

class DDD : public BBB, public CCC {
public:
	void ShowString(){
		String1();// error
		// 이런식으로 사용해야한다.
		// AAA 클래스가 두번 상속되었기 때문에
		// 어디 클래스의 string1을 호출할지 
		// 결정해줘야 한다.
		// 
		// BBB::String1();
		// CCC::String1();
		
		String2();
		String3();
	}
};


int main(void)
{
	DDD ddd;
	ddd.ShowString();

	return 0;
}

// 이러한 문제를 해결하기 위해서
// 추가된 개념이 있다.
// BBB 클래스가 AAA 클래스를 가상으로 상속하고
// CCC 클래스가 AAA 클래스를 가상으로 상속할 때
// BBB 클래스와 CCC 클래스를 동시에 상속하는 
// 클래스 내에서는 AAA 클래스를 한번만 선언한다.
// 상속 선언시 virtual 을 선언해주면된다.
//
//
#include <iostream>
using std::cout;
using std::endl;

class AAA{
public:
	void String1(){
		cout<<"AAA::String"<<endl;
	}
};

class BBB : virtual public AAA{   // class BBB : virtual public AAA
public:
	void String2(){
		cout<<"BBB::String"<<endl;
	}
};

class CCC : virtual public AAA{  // class CCC : virtual public AAA
public:
	void String3(){
		cout<<"CCC::String"<<endl;
	}
};

class DDD : public BBB, public CCC {
public:
	void ShowString(){
		// error가 발생하지 않는다.
		// AAA 클래스가 하나만 상속되기 때문에
		String1();
		
		String2();
		String3();
	}
};


int main(void)
{
	DDD ddd;
	ddd.ShowString();

	return 0;
}

//
// 이러한 다중 상속들은 사용하지 말아야한다.!!!!
//








Posted by 뮹실이

최근에 달린 댓글

05-18 12:46
Yesterday
Today
Total