C++/Modern C++(11, 14, 17, 20)
[C++11] Final specifier
deulee
2023. 8. 24. 18:57
`final` 지정자는 C++11로부터 도입된 키워드로, 클래스 멤버 함수나 가상 함수를 "오버라이드할 수 없도록" 지정하는 데 사용한다.
이를 통해 클래스의 무분별한 확장을 제어하고, 클래스 계층 구조에서 "특정 함수의 변경을 막을 수 있다".
그렇기 때문에 `final` 지정자는 주로 가상 함수와 함께 사용이 된다. 가상 함수는 파생 클래스에서 재정의할 수 있는데, 이를 방지하기 위해 `final`을 사용하는 것이다.
만약 `final` 함수를 오버라이드하려고 한다면 컴파일러가 에러를 발생시키게 된다.
다음 예제 코드를 보도록 하자.
class A {
public:
virtual void foo() final {
std::cout << "class A foo" << std::endl;
}
};
class B : public A {
public:
virtual void foo() {
// 에러 발생
std::cout << "class B foo" << std::endl;
}
};
부모 클래스인 `A` 클래스에서 `foo` 함수를 `final`로 지정함으로써 파생된 클래스 `B`가 해당 함수를 오버라이딩 하려고 하면 컴파일러가 에러를 발생시킨다.
그리고 다음과 같은 상황에서도 에러를 발생시키는데 한번 보도록 하자.
class A final {
public:
virtual void foo() final {
std::cout << "class A foo" << std::endl;
}
};
class B : public A { // 에러 발생
};
이처럼 함수 뿐만 아니라 `final` 키워드로 지정된 클래스는 "파생 클래스를 생성하지 못하게 막는다".
`final` 지정자는 상속 구조를 디자인하거나, 특정 클래스의 특정 함수를 변경하지 못하도록 하는 등의 상황에서 유용하게 활용된다.