상속하지 못하는 클래스 만들기

작업을 하다 보면 상속을 절대 못하도록 막고 싶을 때가 있습니다.

ISO C++ 11 표준에 final 키워드가 추가되어 이것을 해결해 주긴 합니다.

// 가상 함수를 오버라이딩 못하게 하기
class A
{
	virtual void func() final;
};

class A2 : public A
{
	virtual void func(); // 컴파일 에러
};

// 클래스 자체를 상속 못하게 하기
class B final
{
};

class B2 : public B // 컴파일 에러
{
};

하지만 C++ 11 을 제대로 지원하지 못하는 환경에서는 어떻게 할까요?
Visual Studio를 사용한다면 Windows Runtime(/ZW)이나 CLR(/clr) 옵션을 켜도 sealed 키워드를 사용할 수 있습니다.

// 가상 함수를 오버라이딩 못하게 하기
ref class A
{
	virtual void func() sealed;
};

ref class A2 : public A
{
	virtual void func() sealed; // 컴파일 에러
};

// 클래스 자체를 상속 못하게 하기
ref class B sealed
{
};

ref class B2 : public B // 컴파일 에러
{
};

하지만 이 환경도 안되는 경우 어떻게 할까요?

아래와 같은 내용으로 헤더 파일을 만든 뒤에

class __NonDerivableClass
{
protected:
	__NonDerivableClass() {}
	__NonDerivableClass(const __NonDerivableClass&) {}
};
#define nonderivable private virtual __NonDerivableClass

이런 식으로 사용하시면 됩니다.

class A : nonderivable
{
};

하지만 가상 함수 오버라이딩은 막을 수가 없습니다. ㅠㅠ

음… 그냥… 최신 컴파일러를 사용하시는 게 더 좋아보이네요.

글쓴이

BS

BS == Programmer