가상 함수 봉인
업데이트: 2007년 11월
Visual C++ 2008에서는 가상 함수를 봉인하는 구문이 Managed Extensions for C++와 다르게 변경되었습니다.
Managed Extensions의 경우 참조 형식을 수정하고 여기서 더는 파생되지 않도록 하거나(관리되는 클래스 형식 선언 참조) 가상 함수를 수정하여 파생 클래스에서 메서드가 더는 재정의되지 않도록 하는 데 __sealed 키워드를 사용합니다. 예를 들면 다음과 같습니다.
__gc class base { public: virtual void f(); };
__gc class derived : public base {
public:
__sealed void f();
};
이 예제에서 derived::f()는 함수 프로토타입의 정확한 일치 항목을 기반으로 base::f() 인스턴스를 재정의합니다. __sealed 키워드는 이후에 파생 클래스에서 상속되는 클래스로 derived::f()를 재정의할 수 없도록 지정합니다.
이전에는 실제 함수 프로토타입 앞의 아무 위치에나 사용할 수 있던 sealed가 새 구문에서는 시그니처 뒤에 배치됩니다. 또한 sealed를 사용하려면 virtual 키워드도 명시적으로 사용해야 합니다. 즉, 위 예제의 derived를 올바르게 변환하면 다음과 같습니다.
ref class derived: public base {
public:
virtual void f() override sealed;
};
이 경우 virtual 키워드를 생략하면 오류가 발생합니다. 새 구문에서는 컨텍스트 키워드 abstract를 =0 대신 사용하여 순수 가상 함수를 지정할 수 있습니다. Managed Extensions에서는 이러한 방식이 지원되지 않습니다. 예를 들면 다음과 같습니다.
__gc class base { public: virtual void f()=0; };
이 코드는 다음과 같이 수정할 수 있습니다.
ref class base { public: virtual void f() abstract; };