가상함수의 동작원리




A 클래스를보면 virtual 가상함수가 존재한다. 이렇듯 한 개 이상의 가상함수를 포함하는 클래스에 대해서는 컴파일러가 "가상함수 테이블" 이란 것을 만든다. 

이를 간단히 "V-Table(virtual table)" 이라고도 하는데, 이는 실제 호출되어야 할 함수의 위치정보를 담고 있는 테이블 이다.


가상테이블을 확인하면 A 클래스의 Func1에 대한 정보가 존재하지 않는다. 


- 이렇듯, 오버라이딩 된 가상함수의 주소정보는 유도 클래스의 가상함수 테이블에 포함되지 않는다. 때문에 오버라이딩 된 가상함수를 호출하면, 무조건 가장 마지막에 오버라이딩을 한 유도 클래스의 멤버함수가 호출되는 것이다.




가상함수 테이블이 참조되는 방식


- main 함수가 호출되기 이전에 가상함수 테이블이 메모리 공간에 할당된다. 참고도 가상함수 테이블은 객체의 생성과 상관없이 메모리 공간에 할당된다. 

이는 가상함수 테이블이 멤버함수의 호출에 사용되는 일종의 데이터이기 때문이다. 


※ 가삼함수를 하나이상 멤버로 지니는 클래스의 객체에는 가상함수 테이블의 주소 값이 저장된다. 물론 이 주소 값은 우리가 직접 참조할 수 있는 주소 값이 아니다. 내부적으로 필요에 의해서 참조되는 주소 값일 뿐이다.



>>>>>> 결론


# B 클래스의 가상함수를 살펴보면, 오버라이딩 된 A 클래스의 Func1 함수에 대한 정보가 없음을 알 수 있다. 

그래서 B클래스의 Func1 함수가 대신 호출되는데, 이것이 바로 가상함수의 호출원리이다.



※ 가상함수 테이블에 의한 속도의 저하

- 위에서 설명했듯이 클래스에 가상함수가 포함되면, 가상함수 테이블이 생성되고, 또 이 테이블을 참조하여 호출될 함수가 결정되기 때문에 실행속도가 감소하기 마련이다. 하지만 그 속도의 차이가 극히 미미하고 또 이러한 단점에도 불구하고 가상함수는 많은 장점을 제공하기 때문에 유용하게 활용되는 것이다.

Posted by scii
: