상세 컨텐츠

본문 제목

[C++11] Final specifier

C++/Modern C++(11, 14, 17, 20)

by 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` 지정자는 상속 구조를 디자인하거나, 특정 클래스의 특정 함수를 변경하지 못하도록 하는 등의 상황에서 유용하게 활용된다.

'C++ > Modern C++(11, 14, 17, 20)' 카테고리의 다른 글

[C++11] User-defined literals  (0) 2023.08.25
[C++11] Explicit virtual overrides  (0) 2023.08.25
[C++11] Default functions  (1) 2023.08.24
[C++11] Deleted functions  (0) 2023.08.24
[C++11] Range-based for loops  (0) 2023.08.24

관련글 더보기