반응형
c++11 이후로 overide와 final 키워드를 사용할 수 있게 되었다.
간단하게 생각하면 virtual 함수를 오버라이드 하고 싶다면 override키워드를 무조건 함께 사용해주자.
이유는 아래의 예시를 보면 class B에서 가상 함수의 시그니처를 변경하 였을 경우 override 키워드를 사용하지 않은 코드는 컴파일 에러가 발생하지 않는다. 따라서 override키워드를 넣어줌으로써 가상 함수 시그니처 변경의 실수를 막을 수 있고 가독성 또한 좋아진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class A { public: virtual void doSomething(int a) { cout<<"A do"<<endl; } }; class B : public A{ public: virtual void doSomething(float b) override { //compile error cout<<"B do"<<<endl; } }; class A { public: virtual void doSomething(int a) { cout<<A do<<endl; } }; class B : public A{ public: virtual void doSomething(float b) { //compile ok cout<<B do<<endl; } }; | cs |
또한 final 키워드를 사용하여 명시적으로 상속을 막을 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class GrandParent { public: virtual void useMail() { cout<<"send mail"<<endl; } virtual void useMessanger() { cout<<"use text message"<<endl; } }; class Parent : GrandParent{ public: virtual void useMail() override final{ cout<<"send e-mail"<<endl; } virtual void useMessanger() override { cout<<"use kakao talk"<<endl; } }; class Child : Parent { public: virtual void useMail() override { //Declaration of 'useMail' overrides a 'final' function } virtual void useMessanger() override { cout<<"use facebook messanger"<<endl; } }; | cs |
final 키워드가 들어간 useMail 함수를 오바라이드 한 Child에서 아래와 같이 컴파일 에러가 발생한다.
반응형
'C and C++' 카테고리의 다른 글
[C++] 순환참조(Circular Dependency) 제거하는 방법 (1) | 2020.04.12 |
---|---|
[C++][STL] size()함수 주의사항 (0) | 2020.01.29 |
[C++] 복사 생성자와 복사 대입연산자의 차이점 (2) | 2019.01.13 |
[C++] new 연산자 예외처리 (0) | 2018.12.02 |
[C++] Template 템플릿에 대한 기본적인 이해 (0) | 2018.09.09 |