요약
어떤 문제를 해결하기 위한 설계를 찾을 때 가상 함수를 대신하는 방법들도 고려해 보자.
예시
게임 캐릭터의 체력을 반환하는 기능을 구현해보자.
예시코드
public:
virtual int healthValue() const;
위 코드에서 약점을 많이 찾을 수 있다.
가상함수는 반드시 private으로 선언해야한다!
하지만 더 좋은 대체 방안으로 public으로 비가상 함수를 만들고 그 내부에 private으로 선언된 가상 함수를 호출하는 식으로 만들면 좋다.(비가상 함수 인터페이스:NVI)
하지만, 결국 눈속임이다. 게임 캐릭터의 체력을 구현하는 것에 가상함수를 쓴 것은 변함이 없다. 이럴 땐 함수 포인터 데이터 멤버로 대체하자.
또는 std::tr1::function 데이터 멤버로 대체하여 호환되는 시그너처를 가진 함수호출성 개체를 사용
또는 한쪽 클래스 계통에 속해있는 가상함수를 다른 쪽 계통에 속해있는 가상함수로 대체.
잊지말자!