Virtual 키워드는 C++에서 Override 할 시 반드시 붙여줘야 하는 키워드다.
그리고 이를 붙여줘야 하는 이유를 묻는다면 입문자들은 "이걸 붙어야 Override가 되요"라고 답할 것이다.
여기서 C++을 좀 더 배운 사람이라면 이렇게 답할 것이다.
"C++의 virtual 키워드가 붙은 함수들은 vtable에서 함수의 주소값이 관리가 된다.
이후 하위 클래스에서 override를 하면 vtable의 주소값이 변경이 된다.
이를 통해 하위 클래스의 instance에서 override를 한 함수를 호출하면,
vtable에서 함수를 찾는 과정에서 상위 클래스의 함수가 아닌 하위 클래스의 함수를 받아오게 된다."
라고 답할 것이다.
하지만 virtual 키워드가 붙는 경우가 두가지가 더 있다.
하나는 생성자, 다른 하나는 소멸자이다.
그렇다면 생성자(Constructor)와 소멸자(Destructor)에서 virtual 키워드는 어떻게 동작할까?
이 두가지 경우, virtual 키워드가 붙어 있으면 vtable에서 상위 클래스의 생성자나 소멸자를 검색한다.
그리고 검색된 결과를 현재의 생성자/소멸자 코드 앞에 붙여준다.
이는 재귀적으로 발생하여, 최상위 클래스의 생성자/소멸자부터 순차적으로 호출이 된다.
이렇게 모든 생성자/소멸자들이 호출이 되면, 컴파일러는 다시 한번 코드를 자동 생성한다.
바로 멤버를 자동으로 생성/소멸하는 과정이다.
정리를 하자면,
"Virtual 키워드가 붙은 함수는 물론이고 생성자, 소멸자들은 vtable에서 어떤 것을 사용 할지 관리가 된다.
이 중 함수는 Instance에 따라 하위 클래스의 함수를 호출하고,
생성자와 소멸자는 상위 클래스의 것을 먼저 호출한 뒤 자신의 것을 호출하며,
마지막으로 멤버 생성/소멸 과정을 거친다.
때문에 Override 할 때 virtual 키워드를 사용해야 한다."
정도가 될 것 같다.
참고자료: https://stackoverflow.com/questions/7750280/how-does-virtual-destructor-work-in-c
'메모장 > 기술면접' 카테고리의 다른 글
UE4 UPROPERTY란 무엇인가? (0) | 2020.09.01 |
---|---|
C++ malloc/free와 new/delete의 차이점 (0) | 2020.08.28 |
Unity Boxing과 UnBoxing (0) | 2020.08.11 |
UE4 Actor의 Role과 Remote Role (0) | 2020.08.10 |
UE4 Replicate 방식간 차이 (0) | 2020.08.10 |