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; };
* 상속받은 기본 매개변수 값은 절대로 재정의해서는 안됩니다. 왜냐하면 기본 매개변수 값은 정적으로 바인딩되는 반면, 가상 함수(오버라이드할 수 있는 유일한 함수)는 동적으로 바인딩되기 때문입니다.
댓글 없음:
댓글 쓰기