본문 바로가기

Programming/C / C++

[C++] 상속 두번째, 세가지 형태의 상속 (private, protected, public)

 다음과 같이 상속(Inheritance)의 경우를 보자 
 B클래스를 public으로 상속하겠다는 의미로 우리들이 일반적으로 많이 사용하는 class A : [상속형태] B 형태를 가지고 있다. 기본적으로 기본 클래스는 파생 클래스에 의해 상속되어지는 과정에서 접근 권한이 변경이 된다. 그 상속 형태에 따라 멤버들을 상속하는데 있어서 접근권한을 무엇으로 변경할 것이냐 하는 얘기이다. 아래는 기본 클래스와 상속의 형태에 따른 파생클래스에서의 기본클래스로의 접근범위를 표로 나타낸것이다. 일반적으로 public을 가장 많이 쓰이므로 그 부분에 초점을 맞춰서 보는 것이 좋다.

그냥 도표로는 언뜻 이해 하기가 힘드니, 이것을 코드와 분석을 통해서 더 자세히 알아 보자.(상속의 형태는 매번 볼때마다 헷갈리니 잘 알아 두도록 하자)
 protected 상속의 경우  
: protected Base' 로 선언 했다고 가정하자. 상속의 형태가 protected이다. 이 의미는 protected보다 접근 권한이 넓은 것이 있다면, 그냥 protected에 맞춰서 내가 상속을 하겠다는 의미를 가지고 있다. 
 - int c : 상속되어지는 과정에서 int c는 지금 public 인데 protected보다 접근할 수 있는 범위가 넓기 때문에 상속이 되면, protected로 맞춰지게 된다. 
 - int b : 여전히 protected가 된다. 
 - int a : private인 int a는 private는 protected 보다 접근 권한이 작으니까 그대로 private로 상속되겠다 생각하기 쉽지만, 파생 클래스에서 int a는 private int a로 선언이 된다. (상속되면 결과적으로) int a는 private이기 때문에 파생 클래스에서 접근 가능한것으로 생각하기 쉽지만, 접근가능하지 않다 그 이유는 private 멤버의 특성상 자기 클래스 내에서만 접근 가능하지 상속됐다고 파생클래스에서 접근 하지는 못하기 때문이다. 그래서 우리는 헷갈리지 않게 Base 클래스에서 private로 선언된 멤버는 상속이 될때 접근불가 라는 키워드가 붙는다고 생각하는 것이 좋다.

 private 상속의 경우  

 - int c , int b: 이 둘은 private보다 범위가 넓으니 private로 맞춰 지겠다.
 - int a : 위에서 언급한 Base 클래스에서 private로 선언된 멤버는 접근불가라는 것을 기억하자.

 public 상속의 경우  

 - int c : 범위가 같으므로 같은 public 으로
 - int b : public 보다 범위가 작으니 자신 그대로의 접근범위를 가져온다. protected
 - int a :  위에서 언급한 Base 클래스에서 private로 선언된 멤버는 접근불가라는 것을 기억하자.