페이지

2015년 1월 4일 일요일

어떤 함수에 대해서도 상속받은 default 매개변수 값은 절대로 재정의하지 말자.

이 경우는 기본 매개변수 값을 가진 가상 함수를 상속하는 경우로만 한정지어도 될듯 하다.

class Shape {
public:
  enum Color { Red, Gree, Blue };
  virtual void draw(Color c = Red) const = 0;
};

class Rect : public Shape {
public:
  virtual void draw(Color c = Green) const;
};

class Circle : public Shape {
public:
  virtual void draw(Color c) const;
};

Shape* ps; // 정적 타입 : Shape , 동적타입 : X
Shape* pc = new Circle; // 정적 타입 : Shape , 동적타입 : Circle
Shape* pr = new Rect; // 정적 타입 : Shape , 동적타입 : Rect

ps = pc; // 이제 동적타입 : Circle가 됨

pr->draw(); // default로 Green이 호출되야할껀데... Red가 호출된다.

 공식적으로, 정적 바인딩은 선행 바인딩(early binding) 이라고 하고, 동적 바인딩은 지연 바인딩(late binding)이라고 한다.

 그럼 default 값을 같은 값으로 해야 할까 ? 같은 값으로 했는데 추후에 Shape의 default 값을 수정하면 ???
 비가상 인터페이스(non-value interface)관용구 (NVI 관용구) 를 쓰면 된다.

class Shape {
public:
  enum Color { Red, Gree, Blue };
  void draw(Color c = Red) const { doDraw(color); }
private:
  virtual void doDraw(Color) const = 0;
};

class Rect : public Shape {
private:
  virtual void doRaw(Color c) const;
};





* 상속받은 기본 매개변수 값은 절대로 재정의해서는 안됩니다. 왜냐하면 기본 매개변수 값은 정적으로 바인딩되는 반면, 가상 함수(오버라이드할 수 있는 유일한 함수)는 동적으로 바인딩되기 때문입니다.

댓글 없음:

댓글 쓰기