Override-and-Final
Modern C++에 적응하기
Effective Modern C++ Chapter 3. Override and Final
override, final
함수 overriding을 위해서는 아래 조건을 만족해야 한다.
- Base 클래스 함수가
virtual
로 선언되어야 한다. - Base 클래스 함수와 이름이 동일해야 한다.(소멸자는 예외)
- Base 클래스 함수와 매개변수 형식들이 동일해야 한다.
- Base 클래스 함수와
const
성이 동일해야 한다. - Base 클래스 함수의 반환 형식과 예외 명세가 호환되어야 한다.
C++11에서는 추가로 아래 한가지 조건을 더 만족해야 한다.
- Base 클래스 함수와 참조 한정자[1]가 동일해야 한다.
위 조건들을 만족하지 않으면 기존 함수의 overriding이 아닌 새로운 함수가 하위 클래스에 정의된다.
1 | class Base |
위 코드에서 모든 멤버함수는 overriding되지 않는다. 하지만 컴파일러는 어떠한 오류도 발생시키지 않는다.(컴파일러에 따라 일부 오류를 발생시키기도 한다.)
C++11부터는 함수 선언 끝에 override
을 붙여서 “부모 클래스의 함수를 재정의한다” 는 의미를 명시할 수 있다.
1 | class Derived : public Base |
override
는 의미 명시뿐만 아니라 컴파일러에게 hint를 제공함으로써 잘못 선언된 overriding 함수에 대한 컴파일 에러를 발생시킨다.
Base
와 Derived
클래스를 올바르게 작성하면 아래와 같다.
1 | class Base |
override
말고 C++11에 추가된 또다른 하나의 키워드는 final
이다.
가상함수에 final
을 적용하면 하위클래스에서 해당 함수의 재정의를 막는다.
1 | class Base |
final
은 class
자체에도 적용할 수 있는데, 그러면 해당 클래스를 상속하는 것을 막는다.
1 | class Base final |
References
Override-and-Final