본문 바로가기

CS/C++

[C++]상속 접근 지시자

728x90

보통 상속은 아래처럼 이루어집니다.


1
2
3
class Child : public Parent{
    
};
cs


child는 parent 클래스를 상속받아 생성된다.

여기서 public은 상속 접근 지시자(접근 제한자)중 하나이다. 상속 접근 지시자는 상속을 받을때 어떤 수준으로 상속을 받을지 결정합니다. 수준은 총 3가지(private,protected,public)로 분리됩니다.


3가지의 수준은 아래와 같은 정도의 상속정도를 나타냅니다.

각 수준이 어느 정도인지는 아래에서 설명하겠습니다. 여기서는 누가 상대적으로 높은 수준인지를 알 수 있습니다.


상속 접근 지시자에 의해 각 멤버들이 어떻게 상속되는 지를 표현한 표를 봅시다.



각 항목은 상속받은 부모의 멤버들이 자식클래스에서 어떤 멤버에 해당되는지를 나타냅니다.

여기서 부모클래스의 private멤버는 부모클래스만 접근이 가능하기 때문에 자식클래스는 접근이 불가능합니다.


1. private 상속

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
//public,protected,private 상속 -> 상속 접근 지시 자 
class Parent{
    private:
        int a;
    protected:
        int b;
    public:
        int c;
}; 
 
class Child : private Parent{//private 상속
};
 
int main(int argc, char** argv) {
    Child childA;
    cout << childA.a << endl;//a는 Parent 클래스의 private이기 때문에 당연히 접근불가!
    cout << childA.b << endl;//b는 private멤버로 선언. 접근불가!
    cout << childA.c << endl;//c는 private멤버로 선언. 접근불가!
    return 0;
}
cs

private는 해당 클래스 내부에서만 접근이 가능합니다.

private 상속은 private 멤버보다 접근범위가 넓은 멤버를 모두 private로 바꾸어서 상속합니다.
즉, protected와 public멤버들이 자식클래스의 private멤버에 들어가게 됩니다.

2. protected 상속

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
#include <iostream>
using namespace std;
//public,protected,private 상속 -> 상속 접근 지시 자 
class Parent{
    private:
        int a;
    protected:
        int b;
    public:
        int c;
}; 
 
class Child : protected Parent{//protected 상속
    public:
        Child(){
            b = 2;//b,c는 protected멤버에 있기때문에 클래스 내부에서만 접근가능
            c = 3;
        }
};
 
int main(int argc, char** argv) {
    Child childA;
    cout << childA.a << endl;//a는 Parent 클래스의 private이기 때문에 당연히 접근불가!
    cout << childA.b << endl;//b는 protected멤버로 선언. 접근불가!
    cout << childA.c << endl;//c는 protected멤버로 선언. 접근불가!
    return 0;
}
cs


protected 멤버는 외부에서의 접근은 불가능 하지만 상속받은 클래스 내부에서는 접근이 가능합니다.

protected 상속은 protected 멤버보다 접근범위가 넓은 멤버를 모두 protected로 바꾸어서 상속합니다.

즉, protected와 public멤버들이 자식클래스의 protected멤버에 들어가게 됩니다.


3. public 상속

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
//public,protected,private 상속 -> 상속 접근 지시 자 
class Parent{
    private:
        int a;
    protected:
        int b;
    public:
        int c;
}; 
 
class Child : public Parent{//public 상속
};
 
int main(int argc, char** argv) {
    Child childA;
    cout << childA.a << endl;//a는 Parent 클래스의 private이기 때문에 당연히 접근불가!
    cout << childA.b << endl;//b는 protected멤버로 선언. 접근불가!
    cout << childA.c << endl;//c는 public멤버로 선언. 접근가능ㅎ
    return 0;
}
cs


public 멤버는 외부에서 접근이 가능하기 때문에 외부에서 c에 접근이 가능합니다.

public 상속은 public 멤버보다 접근 범위가 더 넓은 멤버를 모두 public으로 바꾸어서 상속합니다.

public 보다 넓은 범위는 public밖에 없으므로, protected는 protected로 public은 public으로 상속합니다.

'CS > C++' 카테고리의 다른 글

[C++]템플릿(template)  (0) 2016.06.07
[C++]다형성(Polymorphism)  (0) 2016.06.07
[C++]복사생성자(Copy Constructor)  (0) 2016.06.07
[C++] 다중상속(Multiple inheritance)  (0) 2016.06.07