항목 37. 계승된 비가상 함수를 재정의하지 않도록 한다.
전제
클래스 D는 클래스 B를 계승했다.
클래스 B는 비가상함수 mf가 있다.
클래스 D는 비가상함수 mf를 재정의했다.
클래스 B형 포인터 p = new 클래스 D 이다.
이유.
1. p->mf 를 이용하면, 객체D는 정신분열적인 행동을 하게 되기 때문이다!
(참조자 역활을 하는건 다 동일하다, 왜냐하면 C++의 다형성 때문이다.)
2008/07/14 14:55 수정 포인터에 정적바인딩 된다. 이 표현이 더 정확하다.
1. p->mf 를 이용하면 D의 mf 가 호출되는것이 아닌 B의 mf 가 호출된다.
이것은 장기적으로 볼때, 난해한 코딩이 되고야 만다.(디버깅이 너무 어려울듯)
2. 만약 클래스 D가 B의 mf와 다르게 해야 한다면, 상속관계 자체가 잘못된것이다!
(전제조건은 B의 mf가 비가상 함수일 필요가 있을 때다.)
해결방법
1. 제목 그대로, 비가상 함수는 재정의 자체를 하지 말라.
(필자는 어쨌거나 재정의 하지 말라고 한다.)
개인적인 생각
1. 코딩은 쉽다. 단지 설계가 어려울 뿐이다.
전제
클래스 D는 클래스 B를 계승했다.
클래스 B는 비가상함수 mf가 있다.
클래스 D는 비가상함수 mf를 재정의했다.
클래스 B형 포인터 p = new 클래스 D 이다.
이유.
1. p->mf 를 이용하면, 객체D는 정신분열적인 행동을 하게 되기 때문이다!
(참조자 역활을 하는건 다 동일하다, 왜냐하면 C++의 다형성 때문이다.)
2008/07/14 14:55 수정 포인터에 정적바인딩 된다. 이 표현이 더 정확하다.
1. p->mf 를 이용하면 D의 mf 가 호출되는것이 아닌 B의 mf 가 호출된다.
이것은 장기적으로 볼때, 난해한 코딩이 되고야 만다.(디버깅이 너무 어려울듯)
2. 만약 클래스 D가 B의 mf와 다르게 해야 한다면, 상속관계 자체가 잘못된것이다!
(전제조건은 B의 mf가 비가상 함수일 필요가 있을 때다.)
해결방법
1. 제목 그대로, 비가상 함수는 재정의 자체를 하지 말라.
(필자는 어쨌거나 재정의 하지 말라고 한다.)
개인적인 생각
1. 코딩은 쉽다. 단지 설계가 어려울 뿐이다.
'책 정리 > Effective C++ 2판' 카테고리의 다른 글
항목 42. private 계승을 바르게 사용하라. (0) | 2008.05.14 |
---|---|
항목 41. 계승과 템플릿과의 차이점을 이해한다. (0) | 2008.05.14 |
항목 40. 레이어링을 통해 가지고 있는 것과 사용하여 구현된것을 모델링하도록 한다. (0) | 2008.05.12 |
항목 39. 계층도의 아래쪽 클래스로 다운캐스트 하지 않도록 한다. (0) | 2008.05.12 |
항목 38. 계승된 부재 인자값을 재정의하지 않도록 한다. (0) | 2008.05.12 |
항목 36. 인터페이스 계승과 구현의 차이점을 이해해라 (0) | 2008.05.12 |
항목 35. public 계승이 isa를 모델링하도록 하라. (0) | 2008.05.11 |
인스턴스와 객체지향 설계 (0) | 2008.05.11 |
34. 파일간의 컴파일 의존성을 최소화 하라 (0) | 2008.05.11 |
항목 33. 인라인을 선별적으로 사용하라. (0) | 2008.05.10 |
최근댓글