현실세계에서나 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
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://coolok.tistory.com 쿨(Cool) 2008.07.04 12:15 신고  Addr  Edit/Del  Reply

    익필씨... 오타.. 일므??? 이름이겠죠? ㅋ

  2. Favicon of http://ikpil.tistory.com 게임 프로그래머라 불릴 최익필 2008.07.14 16:51 신고  Addr  Edit/Del  Reply

    내가봐도 의미를 많이 햇갈려서 "이름 찾기 와 이름 가리기"에 대해서 초점을 두고 다시 정리해 두었음

  3. Favicon of http://ikpil.com 게임 프로그래머라 불릴 최익필 2008.12.16 14:39 신고  Addr  Edit/Del  Reply

    하면 안된다는것을 알면서도 이 같은 일을 겪음, piliocp socket interface 정의 중..