(C++)가상함수 테이블
*가상함수 테이블: 부모클래스의 포인터에 할당 된 실제 객체가 무엇이냐에 따라 실행 할 함수가 정해진다. 각 함수는 다른 위치에 정의가 되어 있을것이다. 즉, 다른 함수를 실행 할 수 있다는 것은 각 함수의 위치를 구별 할 수 있는 방법이 있다는 뜻이다.
*가상 함수를 호출의 개요:
@ 위 그림에서 B클래스를 D클래스가 상속받았고, b와d는 각 클래스의 객체이다.
@ 포인터가 b객체를 가리키고 있다면 고민 할 것 없이 B클래스의 함수들이 실행된다.
@ 포인터가 d객체를 가리키고 있다면 D클래스에서 재정의 된 함수는 D클래스의 것을, 그렇지 않은 것은 B클래스의 것을 실행합니다.
@ 서로 다른 함수들은 임의의 위치에 각 본체가 정의되어 있고, 각 클래스 별로 자신의 각 함수가 어디서 실행해야 되는지가 정해져있고, 이 내용이 바로 '가상함수 테이블'이라고 불린다.
@ 중요한 것은 !!!!!!!!!! 가상함수 테이블 자체는 클래스별로 하나씩 존재하는 것이지, 각 객체별로 존재하는 것이 아니다. 각 객체는 자신의 클래스의 가상함수 테이블의 포.인.터를 가지고 있다.
@ 즉, 객체에 따라(객체의 클래스 종류에 따라) 가상함수 포인터가 가리키는 위치가 달라지고, 그 가상함수 테이블에 의해 객체별로 다른 함수를 실행 할 수 있게 되는 것이다.
이것은 상속의 단계에 상관없이 각 상속 단계별로 모두 적용되며, 역시 각 클래스별로 가상함수 테이블이 존재하고, 각 클래스의 객체는 가상함수 테이블을 가리키는 포인터, 즉 가상함수 포인터를 가지게 된다.
출처: http://rednine.tistory.com/195
*가상 함수를 호출의 개요:
@ 위 그림에서 B클래스를 D클래스가 상속받았고, b와d는 각 클래스의 객체이다.
@ 포인터가 b객체를 가리키고 있다면 고민 할 것 없이 B클래스의 함수들이 실행된다.
@ 포인터가 d객체를 가리키고 있다면 D클래스에서 재정의 된 함수는 D클래스의 것을, 그렇지 않은 것은 B클래스의 것을 실행합니다.
@ 서로 다른 함수들은 임의의 위치에 각 본체가 정의되어 있고, 각 클래스 별로 자신의 각 함수가 어디서 실행해야 되는지가 정해져있고, 이 내용이 바로 '가상함수 테이블'이라고 불린다.
@ 중요한 것은 !!!!!!!!!! 가상함수 테이블 자체는 클래스별로 하나씩 존재하는 것이지, 각 객체별로 존재하는 것이 아니다. 각 객체는 자신의 클래스의 가상함수 테이블의 포.인.터를 가지고 있다.
@ 즉, 객체에 따라(객체의 클래스 종류에 따라) 가상함수 포인터가 가리키는 위치가 달라지고, 그 가상함수 테이블에 의해 객체별로 다른 함수를 실행 할 수 있게 되는 것이다.
이것은 상속의 단계에 상관없이 각 상속 단계별로 모두 적용되며, 역시 각 클래스별로 가상함수 테이블이 존재하고, 각 클래스의 객체는 가상함수 테이블을 가리키는 포인터, 즉 가상함수 포인터를 가지게 된다.
제가 만들었던 예제에서도 한번 그 실체가 정말 있는지 확인해 봤습니다. 폴리곤을 읽어 들이는 부분인데, 이 폴리곤 클래스는 가상함수를 가진 부모들로부터 상속을 받았습니다. 정말 이름도 위의 글처럼 __vfptr이라고 있군요.
p.36
코드 상에서 인터페이스는 C++ 언어와 같은 객체지향 프로그래밍 언어에서의 순수한 가상 함수만을 멤버로 포함하는 추상 클래스로 표현된다. 다시 말해, 인터페이스는 가상 함수 테이블 형식의 메모리 구조를 정의하게 되는 것이다. 그러나 앞에서 언급한 바와 같이 어떤 언어로든 컴포넌트를 구현할 수 있기 때문에 해당 언어 또는 개발 도구가 가상 함수 테이블 형식의 메모리 구조를 정의 할 수 있기만 하면 인터페이스를 정의 할 수 있다.
출처: http://rednine.tistory.com/195
댓글
댓글 쓰기