C++Virtual Function

 

C++에서 virtual function 은 때때로 overriding과 혼동 될 때가 있습니다.

c에만 익숙해져 있다면 virtual이 무슨 단어인고… 라는
혼란도 오지요. template과 같이 virtual도 때때로 C++ 프로그래밍시에
매우 훌륭하게 사용될 수 있어서 virtual의 의미를 아는 것은 중요합니다.

면접 때 C++ 를 안다고 하면서 이 질문을 해보면 실제로 절반 이상 모릅니다.
아래 예를 보시죠.

위를 출력해보면, child’s say 가 출력이 됩니다. 그런데 왜 virtual이 필요한 걸까요? 위의 클래스를 사용한 아래 예를 보시죠.

위의 코드의 출력은 아래와 같습니다.
실제로 Parent 클래스의 포인터를 사용했지만, 실제 객체는 Child의 Instance였음에도 불구하고 parent’s say 가 출력이 됩니다. 이 시점이 바로 virtual이 필요한 시점이죠. 위의 클래스를 이렇게 정의하면

그리고 이렇게 호출해봅니다.

결과는 마법처럼..

이 출력이 됩니다.

virtual을 붙여줌으로써 Pointer의 Type이 아닌,
Instance의 Type을 인지하고 불러주게 되는데요,

바로 virtual이 이런 dynamic binding(late binding)이 가능하게 해주는
keyword이기 때문입니다.
C++ virtual을 기억하실 때 사실 dynamic binding 이란 단어 하나만 기억하셔도 됩니다.

포인터의 타입이 아닌 실 객체의 타입을 알아서 virtual function table을 뒤져서
동적으로 찾아서 호출하는 것입니다.
반면, virtual이 없는 함수들을 compile time binding입니다.
누구를 부를지 이미 정해진 운명을 가지고 태어난 것지요.

virtual class도 마찬가지입니다. pointer에 상관없이 dynamic binding입니다.
instance의 type에 맞는 method를 접근할 수 있게 하죠.