가상함수의 동작원리와 가상함수 테이블
Programming/C++ 2012. 8. 22. 17:11 |가상함수의 동작원리
A 클래스를보면 virtual 가상함수가 존재한다. 이렇듯 한 개 이상의 가상함수를 포함하는 클래스에 대해서는 컴파일러가 "가상함수 테이블" 이란 것을 만든다.
이를 간단히 "V-Table(virtual table)" 이라고도 하는데, 이는 실제 호출되어야 할 함수의 위치정보를 담고 있는 테이블 이다.
가상테이블을 확인하면 A 클래스의 Func1에 대한 정보가 존재하지 않는다.
- 이렇듯, 오버라이딩 된 가상함수의 주소정보는 유도 클래스의 가상함수 테이블에 포함되지 않는다. 때문에 오버라이딩 된 가상함수를 호출하면, 무조건 가장 마지막에 오버라이딩을 한 유도 클래스의 멤버함수가 호출되는 것이다.
가상함수 테이블이 참조되는 방식
- main 함수가 호출되기 이전에 가상함수 테이블이 메모리 공간에 할당된다. 참고도 가상함수 테이블은 객체의 생성과 상관없이 메모리 공간에 할당된다.
이는 가상함수 테이블이 멤버함수의 호출에 사용되는 일종의 데이터이기 때문이다.
※ 가삼함수를 하나이상 멤버로 지니는 클래스의 객체에는 가상함수 테이블의 주소 값이 저장된다. 물론 이 주소 값은 우리가 직접 참조할 수 있는 주소 값이 아니다. 내부적으로 필요에 의해서 참조되는 주소 값일 뿐이다.
>>>>>> 결론
# B 클래스의 가상함수를 살펴보면, 오버라이딩 된 A 클래스의 Func1 함수에 대한 정보가 없음을 알 수 있다.
그래서 B클래스의 Func1 함수가 대신 호출되는데, 이것이 바로 가상함수의 호출원리이다.
※ 가상함수 테이블에 의한 속도의 저하
- 위에서 설명했듯이 클래스에 가상함수가 포함되면, 가상함수 테이블이 생성되고, 또 이 테이블을 참조하여 호출될 함수가 결정되기 때문에 실행속도가 감소하기 마련이다. 하지만 그 속도의 차이가 극히 미미하고 또 이러한 단점에도 불구하고 가상함수는 많은 장점을 제공하기 때문에 유용하게 활용되는 것이다.
'Programming > C++' 카테고리의 다른 글
가상 상속 (Virtual Inheritance) (0) | 2012.08.22 |
---|---|
다중 상속(Multiple Inheritance) (0) | 2012.08.22 |
객체(Instance) 와 멤버함수(Method) 의 관계 (0) | 2012.08.22 |
참조자의 참조 가능성 (0) | 2012.08.20 |
가상 소멸자(Virtual Destructor) (0) | 2012.08.20 |