C++ 가상 함수
이번에는 잠시 C++ 가상 함수에 대해 알아본다.
VScode에서 BeginPlay 함수나 Tick 함수에 virtual과 overide 표시가 붙은 것을 봤을 것이다.
이러한 것이 가상 함수를 나타내며, 이번에 이에 대해 더 자세히 알아보는 과정을 가진다.
기본적으로 가상메소드는 베이스 클래스에 있는 함수를 오버라이드한다.
먼저 강의에서 사용한 예제를 그대로 캡처해보았다.
다음 코드의 결과를 추측해보자.
단순하게 생각해보면 Gun타입 포인터 변수에 대해 한번은 Gun 클래스에 대한 주소접근을, 한번은 Pistol에 대한 주소접근을 해서 할당하였으므로, Gun에 대한 Shoot 함수와 Pistol에 대한 Shoot 함수가 호출된다고 생각할 수 있다.
하지만 결과는 오버라이드 되지 않고, 모두 Gun에 대한 Shoot 함수만 호출된다.
C++에서 가상 함수를 쓰지 않는다면 기본적으로 C++는 포인터의 타입을 이용한다.
여기서 타입이 Gun이기 때문에, Pistol이 아닌 Gun의 Shoot 함수가 실행된 것이다.
따라서 부모 클래스 함수 앞에 virtual이라고 작성함으로서 명시를 해주어야 한다.
이렇게 되면 다이나믹 디스패치라는 기능으로 인하여 포인터가 가리키는 진짜 대상이 누군지 체크가 가능해진다.
오버라이드 하는 함수 뒤에도 override라고 작성을 해주는데, 이는 필수는 아니지만 작성함으로서 명시적으로 사용이 가능하다.
만약 오타같은 경우로 오버라이드에 실패했을 때 Gun에 대한 Shoot 함수가 실행되지만 원인을 바로 찾기가 힘들 수 있는데, 만약 override라고 작성했으면 오타로 작성한 함수가 override된 함수임을 명시했으므로 오타로 인해 오류가 발생했음을 빠르게 인지할 수 있다.
'Unreal > Udemy 강의' 카테고리의 다른 글
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-23 (0) | 2024.05.05 |
---|---|
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-22 (0) | 2024.05.05 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-20 (0) | 2024.05.05 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-19 (0) | 2024.05.04 |
Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 6-18 (0) | 2024.05.04 |