반응형
C++ Inheritance(상속)
- 어떤 클래스가 또 다른 클래스와 기반(base) 파생(derived) 관계를 가질때, 파생클래스 에서는 기반클래스의 필드(멤버변수) 및 메소드(멤버함수) 들을 사용할 수 있다.
- 하지만 기반 클래스의 private 변수,함수 들은, 파생클래스에서도 접근이 불가능하다, protected, public 만 가능하다, 반면에 friend 키워드를 쓰면 가능하긴하다(friend 는 상속에 관계없이, 모든 변수, 함수에 접근할 수 있도록 접근 허용 권한을 주는것)
상속 관계 짓는 방법
클래스를 디자인할때, 콜론(:)을 넣고 뒤에 접근제어자와 다른 클래스의 이름 을 붙이면 된다
ex1)
파생클래스 : 외부접근권한 기반클래스
class MyClassB : public MyClassA
이때 외부 접근권한을 public, private로 정해 줄 수 있는데
public인 경우 클래스 외부에서도 기반 클래스의 public 변수, 함수들에 접근할 수 있게 되고
private인 경우 파생클래스만 기반 클래스의 public 변수 함수들에 접근할 수 있다
ex2)
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
|
class CParent
{
public:
CParent()
:m_iA(0),m_iB(0),m_iC(0)
{
std::cout << "CParent 생성자" << std::endl;
}
~CParent()
{
std::cout << "CParent 소멸자" << std::endl;
}
public:
int m_iA;
protected:
int m_iB;
private:
int m_iC;
public:
void Output()
{
std::cout << "A : " << m_iA << std::endl;
std::cout << "B : " << m_iB << std::endl;
std::cout << "C : " << m_iC << std::endl;
}
};
class CChild : public CParent
{
public:
CChild()
:m_iD(0)
{
m_iB = 200;
// m_iC는 private 이기 때문에 자식 내부에서도 접근이 불가능 하다
//m_iC = 300; // error
std::cout << "CChild 생성자" << std::endl;
}
~CChild()
{
std::cout << "CChild 소멸자" << std::endl;
}
protected:
int m_iD;
};
class CChild1 : private CParent
{
public:
CChild1()
:m_iD(0)
{
m_iA = 100;
m_iB = 200;
std::cout << "CChild1 생성자" << std::endl;
}
~CChild1()
{
std::cout << "CChild1 소멸자" << std::endl;
}
private:
int m_iD;
};
class CChildChild : public CChild
{
public:
CChildChild()
:m_iE(0)
{
m_iD = 500;
std::cout << "CChildChild 생성자" << std::endl;
}
~CChildChild()
{
std::cout << "CChildChild 소멸자" << std::endl;
}
private:
int m_iE;
};
int main(void)
{
/*
상속 관계에서의 생성자 호출 순서 : 부모 -> 자식 순으로 호출됨
상속관계에서의 소멸자 호출 순서 : 자식 -> 부모 순으로 호출됨
*/
CParent parent;
std::cout << std::endl;
CChild child;
std::cout << std::endl;
CChild1 child1;
std::cout << std::endl;
CChildChild childchild;
std::cout << std::endl;
parent.m_iA = 100;
child.m_iA = 200;
// CChild1 클래스는 CParent를 private 상속을 하고 있으므로 CParent에
// Public으로 설정되어있는 멤버들도 외부에서는 접근이 불가능하다.
//child1.m_iA = 300;
//child1.Output();
return 0;
}
|
cs |
실행화면
정리
- 상속관계에서 파생 클래스는 기반 클래스의 생성자를 먼저 호출한뒤 그 다음에 파생 클래스의 생성자를 호출한다
- 소멸자는 생성자의 역순으로 호출된다, 즉 파생클래스 소멸자 -> 기반 클래스 소멸자 순으로 호출 된다
- 파생클래스 : public 기반클래스 -> 외부에서도 기반 클래스의 public 변수및 함수 접근 가능,
- 파생클래스 : private 기반클래스 -> 외부에서 기반클래스의 모든 변수 및 함수 접근 불가능
- protected 접근 제어자는 파생클래스가 기반클래스의 변수 또는 함수에 접근할 수 있도록 해준다
반응형
'C++' 카테고리의 다른 글
C++ lvalue, rvalue, xvalue, glvalue, prvalue (0) | 2020.03.12 |
---|---|
C++ Inheritance (상속) _ 다형성, 업캐스팅, 다운캐스팅 (0) | 2020.03.10 |
c++ Singleton Pattern 기본 구현 방법 (0) | 2020.03.03 |
const (0) | 2020.02.29 |
Static Member Function(정적 멤버 함수) (0) | 2020.02.27 |