항목 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. 코딩은 쉽다. 단지 설계가 어려울 뿐이다.



신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://rgoon.net rgoon 2008.05.12 01:49 신고  Addr  Edit/Del  Reply

    Effective C++에서의 '계승'은 '상속(Inheritance)'을 말하는 건가요?