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

Bogoomi·2022년 7월 9일
0

EffectiveC++

목록 보기
19/24

항목37 - 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자



요약

상속받은 기본 매개변수를 왜 바꾸면 안되는 걸까?
기본적으로 가상 함수는 동적으로 바인딩되지만, 기본 매개변수 값은 정적으로 바인딩 된다.

정적 바인딩은 early binding 이라 불리고, 동적 바인딩은 late binding이라 불린다. 이는 서로 실행되는 타이밍이 다름을 뜻한다.
때문에 매개변수에 값을 넣은 부모클래스 멤버함수를 파생클래스에서 매개변수 설정값을 바꾼다고해서 바뀌지 않음을 말한다.

예제 코드

class Shape {
public : 
	virtual void draw(ShapeColor color = Red) const = 0;
};
class Rectangle : public Shape {
public:
	virtual void draw(ShpaeColor color = Green) const;
};
class Circle : public Shape {
public:
	virtual void draw(ShpaeColor color) const;
};

Shape *ps;
Shape *pc = new Circle;
Shpae *pr = new Rectangle;```

위와 같이 상속이 이루어진 코드가 있을 때,

pr -> draw(); 

위 코드를 실항하면 Rectangle::draw(Shape::Red)를 호출하게 된다! 매개변수가 정적 바인딩이기 때문에.

35장에서 배운 해결방법으로는 비가상 인터페이스 관용구를 사용하는 것이다.

예제코드

class Shpae
{
public:
	void draw(ShpaeColor color = Red) const;
	{ 
		doDraw(color) 
	}

private:
	virtual void doDraw(ShpaeColor color) const = 0;
};

부모클래스를 이런식으로 작성하면 color 매개변수에 대한 기본값을 깔끔하게 Red로 둘 수 있게 된다.





잊지말자!

  • 상속받은 기본 매개변수 값은 절대로 재정의해선 안된다! 기본 매개변수는 정적 바인딩, 가상 함수는 동적바인딩이 되기 때문!
profile
개에에에바알

0개의 댓글