[C/C++] override, final

그림자왕국·2020년 10월 28일
0

C++

목록 보기
4/24
post-thumbnail

override

override 키워드는 가상 함수를 상속 받은 하위 클래스의 끝 부분에 붙이는 키워드다.

이 키워드는 컴파일러와 개발자에게 가상 함수를 오버라이딩한 함수라는 뜻을 나타낸다.

Base { virtual void test(); }

Derived : Base { void test() override; } // 이 함수는 Base의 test 함수를 오버라이딩한 함수다.

가상 함수의 virtual 선언은 상속되므로 오버라이딩 시 (파생 클래스의) virtual을 생략할 수 있다.

override 키워드를 주로 사용하는 용도는 Base에 없는 메소드를 오버라이드하려는 실수를 막을 수 있다는 점이다.

위의 Base 가상 함수 func는 int형을 인자로 받지만 파생 클래스의 func은 float형을 인자로 받았다.

오버라이드는 함수의 이름과 시그니처가 모두 동일해야지만 이루어진다.

파생 클래스 func는 인자형을 부모 함수의 int가 아닌 flaot로 하였기에 오버라이드가 아닌 사실상
Gun 만의 새로운 함수를 정의했다고 볼 수 있다.

(사실 위 함수는 맹글링을 통해 심볼을 받으면 다른 형식의 별개의 함수로 취급되기 때문이다.)


override 키워드는 해당 함수가 오버라이딩을 통해 재정의 된 함수라는 걸 명시해주는 키워드다.

그렇기에 키워드가 붙었지만 오버라이딩이 되지 않은 함수는 에러를 출력하는 기능을 갖고 있다.

위의 override가 붙은 파생 클래스의 func도 인자의 자료형을 float로 했기에 오버라이딩이 안 되어
에러를 출력하는 것이다.

결국 개발자가 오버라이드를 의도한 상황과 달리 매개변수의 자료형 등을 실수하여 오버라이드가 안 됬을 경우에 대비하여 잘못된 함수로 정의되었을 때 컴파일러가 override 키워드를 통해 확인하여 개발자에게 알려주는 기능을 제공한다.

개발자는 override 키워드를 통해 멤버 함수에 제약을 거는 것으로 안전한 오버라이딩을 가능케 한다.


Final

final 키워드는 클래스와 가상 함수에 쓰이는데 먼저 가상 함수의 마지막을 뜻한다는 걸 명시해주는
키워드로서 해당 함수를 상속을 통해 더 이상 오버라이드 시키지 않겠다는 의미를 가지는 키워드다.

그리고 클래스에도 사용하여 상속을 방지하는 키워드로서 사용할 수 있다.

class Base final { // 클래스명 뒤에 붙인다
	Base() = default;
};
class Derived : public Base { // 컴파일 에러 발생!
	Dervied() = default;
};

Base 클래스는 final로 선언되었기에 더 이상 상속될 수 없다. 그래서 Derived 컴파일 에러가 발생한다.

final 키워드는 가상 함수에도 적용 가능하다. 물론 오버라이드를 막기 위한 거라서 일반 멤버 함수는 사용할 수 없다.

위 상속 구조의 Gun 클래스에는 final 키워드가 존재한다.

위 클래스 설계는 func 가상 함수를 차례차례 오버라이드하는 구조인데 두 번째 Gun 클래스에 오버라이드 된 func 가상 함수에 final 키워드를 사용했다.

final 키워드가 붙은 Gun의 가상 함수는 더 이상 오버라이드 되지 못하며, Gun을 상속 받는 AK에서 해당 함수를 오버라이드 하려 할 경우 컴파일 에러가 발생한다.

정리하자면, Gun 클래스는 Weapon의 가상 함수 func은 final 키워드가 없어서 Gun에서 오버라이드가 가능하였고 Gun에선 오버라이드 된 func 가상 함수에다 final 키워드를 붙였기에 Gun을 상속 받는 AK 클래스에선 더 이상 func 함수를 추가로 오버라이드하기 불가능했기 때문에 에러가 발생한 것이다.

그래서 AK를 동적할당한 객체가 func을 호출할 경우 Gun에서 상속 받은 Gun 클래스의 func 함수를 호출할 수 밖에 없다.


이렇듯 C++11에선 final 키워드의 추가로 간단하게 상속과 오버라이딩을 차단할 수 있는 방법이 생겼고,

override 키워드를 통하여 오버라이딩을 명시하여 사용자의 의도치 않은 실수를 줄일 수 있게 되었다.

profile
언리얼 엔진 매니아입니다.

0개의 댓글