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

 

How Does Virtual Destructor work in C++

I will type an example : class A { public: virtual ~A(){} }; class B: public A { public: ~B() { } }; int main(void) { A * a = new B; delete a; return 0; } Now in Above Example , destructors ...

stackoverflow.com

'메모장 > 기술면접' 카테고리의 다른 글

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

+ Recent posts