Override, Final
Override
부모 클래스에서 virtual로 선언한 함수를 자식 클래스에서 오버라이딩한다는 의미의 키워드이다.
- 컴파일러는 프로그래머의 의도를 정확하게 알 수 없기 때문에, 다음과 같이 프로그래머가 실수할 수 있는 상황이 생긴다.
예제
print
함수를 오버라이딩하려는데, 실수로 파라미터를int
가 아닌short
로 작성한 상황이다.#include <iostream> class A { public: virtual void print(int x) { std::cout << "A" << std::endl; } }; class B : public A { public: void print(short x) { std::cout << "B" << std::endl; } }; int main() { using namespace std; A a; B b; A& ref = b; ref.print(1); } /* stdout A */
이럴 때 함수의
body
앞에override
키워드를 사용하면 컴파일러에서 감지할 수 있다.#include <iostream> class A { public: virtual void print(int x) { std::cout << "A" << std::endl; } }; class B : public A { public: void print(short x) override // 에러 { std::cout << "B" << std::endl; } }; int main() { using namespace std; A a; B b; A& ref = b; ref.print(1); }
error C3668: 'B::print': method with override specifier 'override' did not override any base class methods
Final
override
처럼 함수의body
전에final
키워드를 붙이면, 자식 클래스에서 오버라이딩하지 않는다는 뜻으로 간주한다.- 만약
final
키워드를 작성했는데 자식 클래스에서 오버라이딩할 경우, 에러가 발생한다.
#include <iostream> class A { public: virtual void print() { std::cout << "A" << std::endl; } }; class B : public A { public: void print() final { std::cout << "B" << std::endl; } }; class C : public B { public: virtual void print() // 에러 { std::cout << "C" << std::endl; } }; int main() { using namespace std; A a; B b; A& ref = b; ref.print(); }
error C3248: 'B::print': function declared as 'final' cannot be overridden by 'C::print'
- 만약
'C++ > Class' 카테고리의 다른 글
C++ 가상 소멸자 (0) | 2021.03.20 |
---|---|
C++ 공변 반환형(Covariant Return Type) (0) | 2021.03.20 |
C++ 가상 함수와 다형성 (virtual) (0) | 2021.03.20 |
C++ 다형성의 기본 개념 (0) | 2021.03.20 |
C++ 다형성 (Polymorphism) (0) | 2021.03.20 |