C++ 가상 함수를 안전하게 정의하기

가상 함수는 편리하지만, 그만큼 위험하기도 합니다. 특히 상위 클래스의 동작을 유지하면서, 하위 클래스에서 어떤 동작을 추가적으로 해야 할 경우엔 더 그렇습니다. 즉, 다음과 같은 상황입니다.

class superclass
{
public:
	virtual void do() {}
};

class subclass : public superclass
{
public:
	virtual void do()
	{
		superclass::do();
		...
	}
};

클래스의 계통 구조가 복잡해지면, 하위 클래스의 가상 함수에서 상위 클래스의 함수를 언제 호출해야 하는지 잊기 쉽습니다. 그래서 쉽게 파악하기 힘든 버그를 발생시킵니다. 이를 해결하는 좋은 방법은 재정의가 가능한 부분과 재정의하면 안 되는 부분을 분리하는 것입니다. 즉, 다음과 같습니다.

class superclass
{
public:
	void do()
	{
		...
		do_overridable();
	}

protected:
	virtual void do_overridable() {}
};

class subclass : public superclass
{
protected:
	virtual void do_overridable()
	{
		...
	}
};

위처럼 하면 상위 클래스의 동작은 유지하면서, 하위 클래스에서 추가적인 동작을 수행할 수 있습니다. 위와 같은 처리는 일종의 template method pattern이라고도 볼 수 있습니다.

인터페이스는 잘못 사용하기 어렵게 만들어야 합니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중