현실세계에서나 C++ 세계에서나 이름은 중요하다. 그래서 이런 관용어구가 딱 들어 맞는데
"이름을 훔쳐가는 자는 빼앗긴 사람만 빈털터리로 만들고 마는 것입니다 : He that filches from me my good name ... makes me poor indeed : 곽용재씨께선 명예를 이름으로 본문성격에 맞추어 해석했다고 적혀 있음" 어떤가 딱 들어 맞는가? 왜 이런 의미로 쓰이는지 C++의 코드를 통하여, 알아 보자.
1. 예시 코드
이 코드가 어떻게 움직일지는 다들 알겠지만 전역 변수 x에 값을 넣는것이 아닌, "최초 자신의 지역 범위부터 이름을 찾고 없으면 전역으로 찾는다" 로 해석 된다. 이것을 기본 베이스로, 클래스의 상속기반에 이름이 어떻게 움직이는지 안다면, 놀라서 까무라 칠것이다. 그 놀라 까무라 치는게 무엇인가? 예시코드 2번을 준비 해 두었다.
2. 예시 코드
여기선 상속했으면 Base의 함수들 모두 상속되지만, 함수가 mf1()만 정의 되어 있다면, 나머지 이름은 가린다는 것을 말하고 싶다. 또한 순수 가상함수의 경우 상속받은 파생 클래스가 정의하지 않으면 컴파일이 되지 않는것은 여담이다;
3. 예시코드
여기서 말하고자 하는 것은 이름을 찾기 위해서 using Base::mf1; 쓰라는것이다. 이것은 이름 찾는 영역을 Base 까지 넓히는 효과를 가진다. 이 이야기는 오버로딩 되는 함수들을 모두 써야할 필요가 없을땐 아주 유용한 개념이다. 꼭 기억해 두었다가 상위 클래스에서 오버로딩 된것이 있다면, 적절하게 사용 해야 할 것이다.
4. 예시코드
여기서 말하고자 하는 것은 이름을 가리지만 Base::mf1(3) 처럼 명시적으로 가리켜 호출 할수 있다는 것을 의미하며, private: 라고 할지라도 호출 할수 있다는 것을 보여준다. 또한 private: 상속을 어떻게 구현해야 할지도 보여준다.
부수적으로 몇가지 더 이야기 하자면
public: 상속이라 하면, Derived 는 Base 이다를 뜻한다. 그러므로 Derived에서 Base의 것들을 이름을 가려서 상속받겠다는 생각은 public: 상속에 위배된다. 가려서 받겠다는것 자체가 이미 다른 클래스를 뜻하기 때문이다. public: 상속이라면, 다 상속해야 한다.
하지만 인생사가 그렇게 간단하지만은 않다. 이름을 가려서 구현하고자 할때는 예시코드4에서 나타낸것처럼 private: 로 상속하여, 명시호출을 하면 괜찮을 듯 싶다.(주석을 꼭 달아 가독성에 도움을 주는것이 좋을 듯 싶다..) 하지만 멤버 변수도 private: 이기 때문에... 이런저런 고민이 많다.
이것만은 잊지 말자!
1. 파생 클래스의 이름은 기본 클래스의 이름을 가린다. 이것은 public 상속을 위배한다.
2. 가려진 이름을 다시 보려면 using 선언 혹은 전달 함수를 쓸수 있다.
관련링크
http://ikpil.tistory.com/290
1. 예시 코드
이 코드가 어떻게 움직일지는 다들 알겠지만 전역 변수 x에 값을 넣는것이 아닌, "최초 자신의 지역 범위부터 이름을 찾고 없으면 전역으로 찾는다" 로 해석 된다. 이것을 기본 베이스로, 클래스의 상속기반에 이름이 어떻게 움직이는지 안다면, 놀라서 까무라 칠것이다. 그 놀라 까무라 치는게 무엇인가? 예시코드 2번을 준비 해 두었다.
2. 예시 코드
여기선 상속했으면 Base의 함수들 모두 상속되지만, 함수가 mf1()만 정의 되어 있다면, 나머지 이름은 가린다는 것을 말하고 싶다. 또한 순수 가상함수의 경우 상속받은 파생 클래스가 정의하지 않으면 컴파일이 되지 않는것은 여담이다;
3. 예시코드
여기서 말하고자 하는 것은 이름을 찾기 위해서 using Base::mf1; 쓰라는것이다. 이것은 이름 찾는 영역을 Base 까지 넓히는 효과를 가진다. 이 이야기는 오버로딩 되는 함수들을 모두 써야할 필요가 없을땐 아주 유용한 개념이다. 꼭 기억해 두었다가 상위 클래스에서 오버로딩 된것이 있다면, 적절하게 사용 해야 할 것이다.
4. 예시코드
여기서 말하고자 하는 것은 이름을 가리지만 Base::mf1(3) 처럼 명시적으로 가리켜 호출 할수 있다는 것을 의미하며, private: 라고 할지라도 호출 할수 있다는 것을 보여준다. 또한 private: 상속을 어떻게 구현해야 할지도 보여준다.
부수적으로 몇가지 더 이야기 하자면
public: 상속이라 하면, Derived 는 Base 이다를 뜻한다. 그러므로 Derived에서 Base의 것들을 이름을 가려서 상속받겠다는 생각은 public: 상속에 위배된다. 가려서 받겠다는것 자체가 이미 다른 클래스를 뜻하기 때문이다. public: 상속이라면, 다 상속해야 한다.
하지만 인생사가 그렇게 간단하지만은 않다. 이름을 가려서 구현하고자 할때는 예시코드4에서 나타낸것처럼 private: 로 상속하여, 명시호출을 하면 괜찮을 듯 싶다.(주석을 꼭 달아 가독성에 도움을 주는것이 좋을 듯 싶다..) 하지만 멤버 변수도 private: 이기 때문에... 이런저런 고민이 많다.
이것만은 잊지 말자!
1. 파생 클래스의 이름은 기본 클래스의 이름을 가린다. 이것은 public 상속을 위배한다.
2. 가려진 이름을 다시 보려면 using 선언 혹은 전달 함수를 쓸수 있다.
관련링크
http://ikpil.tistory.com/290
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 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 |
항목 32: public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자. (0) | 2008.07.02 |
항목 31: 파일 사이의 컴파일 의존성을 최대로 줄이자 (0) | 2008.07.02 |
항목 30: 인라인 함수는 미주알고주알 따져서 이해해 두자 (0) | 2008.07.01 |
항목 29: 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2008.07.01 |
항목 28: 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자. (0) | 2008.06.28 |
최근댓글