2013. 11. 28. 22:57 C언어

c++ 공부 요점정리 21






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
// ##########################################
//
// 			36 상속을 하는 이유
//
// ##########################################
// 다른 두 클래스의 멤버가 같을때
// 반복적으로 같은 내용이 중복될때 사용

// ##########################################
//
// 				37 상속의 조건
//
// ##########################################
// 학생 클래스는 사람 클래스이다.
// 와 같은 is a 관계가 성립되어야한다.
// 사람클래스는 학생클래스이다.는 적절하지 않은
// 상속이다..
//
// derived 클래스가 base 클래스를 상속하면
// derived 클래스가 base 클래스의 특성을 
// 포함하기때문...

// ##########################################
//
// 				38 상속의 조건
//
// ##########################################
// has a (소유)관계에 의한 상속
//
// 학생 클래스는 책 클래스를 상속한다.
// 학생은 책을 소유한다.는 의미
//
// has a 관계에 의한 상속의 대안
// : 포함관계를 통해서 소유 관계를 표현
//   객체 멤버에 의한 포함관계 형성 (예제 1)
//   객체 포인터 멤버에 의한 
//   포함 관계의 형성 (예제 2)
//
//
// 예제 1
//
#include <iostream>
using std::endl;
using std::cout;

class Cudgel  //몽둥이
{ 
public:
	void Swing(){ cout<<"Swing a cudgel!"<<endl; }
};


class Police //몽둥이를 소유하는 경찰
{
	Cudgel cud;
	// 위 문장을
	// codgel cud(10); 이라는 문장을 쓸수 있지
	// 않을 까 싶은데
	// 적절하지 않다.
	// 왜냐하면 객체를 생성과 동시에 초기화하는
	// 효과를 지니는데
	// 클래스의 멤버는 생성과 동시에 초기화가 불가능하다
	// 자바나 씨샵은 가능하지만..
	// 클래스의 객체가 멤버로 존재하기 위해서는
	// 반드시 객체의 클래스는 void 생성자를 
	// 가져야 한다.
public:
	// 폴리스 클래스는 몽둥이 클래스의 객체를 
	// 포함하기 때문에
	// 자기가 가지고 있는 멤버의 스윙함수를 호출할
	// 수 있다.
	void UseWeapon(){ cud.Swing(); }
};

int main()
{
	// 다음과 같이 경찰 클래스의 객체 pol을 생성하면
	// 몽둥이 클래스를 포함하는 경찰 객체가 만들어지는데
	// 몽둥이 클래스의 객체인 cud도 객체이므로
	// 경찰 클래스와 몽둥이 클래스의 생성자가 모두 호출
	// 되어야 한다.
	//
	// 1. 경찰 객체를 위한 메모리 공간을 할당하면서
	// 2. 몽둥이 클래스를 위한 메모리 공간을 할당과 동시에
	// 3. 몽둥이 클래스의 생성자가 호출되고
	// 4. 경찰 클래스의 생성자가 호출된다.
	//
	// 명시적으로 어떤 생성자를 호출할지 
	// 선언되어 있지 않으므로 void 형태 생성자를 호출한다.
	// 즉, 클래스의 객체가 멤버가 포함되기 위해서는
	// 인자값을 받지않는 void 생성자를 포함해야한다.
	Police pol;
	
	pol.UseWeapon();

	return 0;
}

//
// 예제 2
//
#include <iostream>
using std::endl;
using std::cout;

class Cudgel  //몽둥이
{ 
public:
	void Swing(){ cout<<"Swing a cudgel!"<<endl; }
};


class Police //몽둥이를 소유하는 경찰
{
	Cudgel* cud;
public:
	Police(){
		// 객체를 동적으로 생성
		// 객체를 생성하면서 어떤 생성자를 호출할지
		// 선언이 없으므로 void 생성자를 호출
		// cud는 동적으로 생성된 몽둥이 객체를 
		// 가리키게 된다.
		cud=new Cudgel;
	}
	~Police(){
		delete cud;
	}
	void UseWeapon(){ cud->Swing(); }
};

int main()
{
	Police pol;
	pol.UseWeapon();

	return 0;
}

// has a (소유)관계는 상속에 의해서도 성립되고
// 대안의 방법으로도 성립이 되는데
// 보통은 대안의 방법을 권장한다.
// 상속의 경우는 두 클래스가 너무 긴밀하게
// 연결이 되어 있기 때문에..
// 상속은 느슨하면서도 확실한 관계가 좋은것.
// 즉, 필요한 경우 분리가 가능해야한다.
// 예제 2와 같이 사용하는게 좋다
// 예제 2가 약간 느슨하면서도 확실한 관계이다






'C언어' 카테고리의 다른 글

c++ 공부 요점정리 23  (0) 2013.12.04
c++ 공부 요점정리 22  (0) 2013.12.04
c++ 공부 요점정리 20  (0) 2013.11.27
c++ 공부 요점정리 19  (0) 2013.11.27
c++ 공부 요점정리 18  (0) 2013.11.27
Posted by 뮹실이

최근에 달린 댓글

05-20 21:11
Yesterday
Today
Total