public 상속이나 protected 상속, private 상속일 때, 인터페이스(접근 할 범위)가 어떻게 바뀌는지 안다는 전제하에서 이야기를 진행한다.
private 상속은 (is-implemented-in-terms-of) 패턴을 뜻한다. 즉, ...는 ...를 써서 구현되었다 라고 할수 있다. 38항목에 자세하게 적어 두었으니 읽어 보면 도움이 될 듯 하다.
자 소스 코드가 있어야 이해가 될듯 하여, 소스코드를 포함한다.
보면 알겠지만, 63번 라인에서 보였듯이, 컴파일러가 인정해 주지를 않는다. 즉 별개의 클래스라는 것이다. 이것은 is-a 관계가 아니라고 컴파일러도 판단한다.
private 상속의 의미는 알겠는데, 굳이 사용할 일이 있을까?
거의,, 사용하지 않는다,. 수업들을 때도 실무에서도 거의.. 거의 쓰지 않는다고 했었다. 하지만 에외는 있는법, 크게 3가지 경우일때 private 상속을 사용 할수 있다.
A,B 클래스 사이에서 public 상속이 모순이 되고, 한 클래스가 다른 클래스의
1. protected 멤버에 접근할 필요가 있을 때
2. 가상 함수를 재정의할 필요가 있을 때
3. 공백 기본 클래스 최적화(empty base optimization : EBO) 기법을 사용 할 때
3번은 문제의 요지와 거리가 멀기에, 1번과 2번만 풀이하겠다.
1번
A 클래스가 protected에 함수들을 넣고 private에 데이터를 넣었다. ... 상속밖엔 접근 방법이 없다. 이럴 때 B 클래스가 private로 상속하여 구현한다, 이건 이렇게 할 수밖에 없다!
2번
A클래스의 필요한 기능이 가상함수로 정의되어 있다면, B는 private로 상속하여, 자신의 입맛데로 재정의를 해서 사용하려 할때 public 상속이 부담스럽고, 깔끔하게 설계하고자 할 경우 쓴다.
2번의 경우엔 private 상속보다 객체 상속을 선호 하는데, 그 이유가 첫째로 B의 파생 클래스에서 A의 가상함수를 재정의하는것을 막고 싶을 때(이건 당연) 둘째로 컴파일 의존성을 줄이기 위해서(이것도 당연)
이것만은 잊지 말자!
1. private 상속의 의미는 is-implemented-in-terms-of(...는 ...를 써서 구현됨)이다.
2. 객체 합성과 달리 private 상속은 EBO를 활성화 시킬수 있다.
3. 꼭 private 설계만이 좋은것은 아니니, 여러 갈래로 설계를 해보는 습관을 기르자.
관련링크
http://ikpil.tistory.com/343
private 상속은 (is-implemented-in-terms-of) 패턴을 뜻한다. 즉, ...는 ...를 써서 구현되었다 라고 할수 있다. 38항목에 자세하게 적어 두었으니 읽어 보면 도움이 될 듯 하다.
자 소스 코드가 있어야 이해가 될듯 하여, 소스코드를 포함한다.
보면 알겠지만, 63번 라인에서 보였듯이, 컴파일러가 인정해 주지를 않는다. 즉 별개의 클래스라는 것이다. 이것은 is-a 관계가 아니라고 컴파일러도 판단한다.
private 상속의 의미는 알겠는데, 굳이 사용할 일이 있을까?
거의,, 사용하지 않는다,. 수업들을 때도 실무에서도 거의.. 거의 쓰지 않는다고 했었다. 하지만 에외는 있는법, 크게 3가지 경우일때 private 상속을 사용 할수 있다.
A,B 클래스 사이에서 public 상속이 모순이 되고, 한 클래스가 다른 클래스의
1. protected 멤버에 접근할 필요가 있을 때
2. 가상 함수를 재정의할 필요가 있을 때
3. 공백 기본 클래스 최적화(empty base optimization : EBO) 기법을 사용 할 때
3번은 문제의 요지와 거리가 멀기에, 1번과 2번만 풀이하겠다.
1번
A 클래스가 protected에 함수들을 넣고 private에 데이터를 넣었다. ... 상속밖엔 접근 방법이 없다. 이럴 때 B 클래스가 private로 상속하여 구현한다, 이건 이렇게 할 수밖에 없다!
2번
A클래스의 필요한 기능이 가상함수로 정의되어 있다면, B는 private로 상속하여, 자신의 입맛데로 재정의를 해서 사용하려 할때 public 상속이 부담스럽고, 깔끔하게 설계하고자 할 경우 쓴다.
2번의 경우엔 private 상속보다 객체 상속을 선호 하는데, 그 이유가 첫째로 B의 파생 클래스에서 A의 가상함수를 재정의하는것을 막고 싶을 때(이건 당연) 둘째로 컴파일 의존성을 줄이기 위해서(이것도 당연)
이것만은 잊지 말자!
1. private 상속의 의미는 is-implemented-in-terms-of(...는 ...를 써서 구현됨)이다.
2. 객체 합성과 달리 private 상속은 EBO를 활성화 시킬수 있다.
3. 꼭 private 설계만이 좋은것은 아니니, 여러 갈래로 설계를 해보는 습관을 기르자.
관련링크
http://ikpil.tistory.com/343
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 44: 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자. (0) | 2008.07.30 |
---|---|
항목 43: 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자. (2) | 2008.07.28 |
항목 42: typename의 두가지 의미를 제대로 파악하자. (12) | 2008.07.25 |
항목 41: 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 (0) | 2008.07.25 |
항목 40: 다중 상속은 심사숙고해서 사용하자. (0) | 2008.07.25 |
항목 38: "has-a(...는...를가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화 할 때는 객체 합성을 사용하자. (2) | 2008.07.18 |
항목 37: 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의 하지 말자. (0) | 2008.07.16 |
항목 36 : 상속받는 비가상 함수를 파생 클래스에서 재정의 하는 것은 절대 금물! (1) | 2008.07.14 |
항목 35: 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. (0) | 2008.07.14 |
항목 34: 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. (0) | 2008.07.09 |
최근댓글