가상함수를 이용한 다양한 패턴들.
1.템플릿 메서드 패턴
- 가상함수를 private에서 재정의 하고, 실제로 외부에 공개되는 함수는 public에 따로 선언하여 가상함수를 호출한다. 이를 통해 현재 클래스에서 가상함수를 사용하기 전 후에 적절한 처리를 해줄 수 있다.
class GameCharacter {
public:
int healthValue() const
{
...// 사전 동작
int retVal = doHealthValue();
...//사전 동작
return retVal;
}
private:
virtual int doHealthValue() const
{
...
}
2.함수포인터를 이용한 패턴
파생클래스의 타입과 무관하게 클래스 생성자에 함수포인터를 넘겨서 객체를 생성할 때 어떤 함수를 사용할지를 결정하는 방식. 같은 타입의 객체도 다른 함수를 사용하게 할 수 있다.
--> 문제점: 외부의 함수를 사용하게 되므로 캡슐화가 무너질 수 밖에 없다.
class EvilBadGuy: public GameCharacter {
pulibc:
explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf)
{ ... }
...
};
int loseHealthQuickly(const GameCharacter&);
int loseHealthSlowly(const GameCharacter&);
EvilBadGuy ebg1(loseHealthQuickly);
EvilBadGuy ebg2(loseHealthSlowly);