-
Effective C++...34일지 2022. 8. 5. 07:27
상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물!
문제가 되는 이유
다음과 같이 상속된 클래스의 비가상 함수를 재정의하는 경우 derived 클래스의 해당 함수는 부모의 함수를 호출할 수도, derived 클래스의 함수를 호출할 수도 있는 상태가 된다.
class B {
public:
void mf();
};
class D : public B {
public:
// 상속된 비가상 함수 mf를 재정의
void mf();
};
B x;
B* pB = &x;
pB->mf(); // B의 mf 실행
D* pD = &x;
pD->mf(); // B의 mf가 실행될 수도 있고 D의 mf가 실행될 수도 있다.
이러한 문제가 발생하는 원인은 비가상 함수가 정적 바인딩으로 묶이기 때문에 클래스가 생성될 때 함수가 결정되게 되기 때문이다. 반면에 가상 함수는 동적 바인딩으로 함수 실행 시에 동작을 결정한다.
※ 이러한 문제를 예방하기 위해서는 public 상속 클래스가 is-a 관계가 맞는지 확인해야 한다.