프로그래밍/Effective c++

35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자.

CuriousBear 2016. 3. 10. 16:41
가상함수를 이용한 다양한 패턴들.

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);