가상함수 테이블의 범위는
글쓴이: yopeule / 작성시간: 금, 2014/12/05 - 6:22오전
class Object {
}
class Unit1 : public Object {
}
class UniqueUnit1 : public Unit1 {
}
class UniqueUnit2 : public Unit1 {
}
class Unit2 : public Object {
}
class Unit3: public Object {
}
위와 같은 클래스들이 있고 공통적으로 함수 virtual void f();를 갖는다고 할 때,
Unit1* unit = new UniqueUnit2;
unit->f(); 를 호출할 때 가상함수를 Unit1의 자식들 중에서만 찾아서 2개의 목록을 갖나요,
아니면 부모 등등 그 함수가 연관된 모든 가상함수들 중에서 찾아서 6개의 목록을 갖나요?
Forums:
Effective C++ 3판에 가상함수 테이블을
Effective C++ 3판에 가상함수 테이블을 사용한 호출 메커니즘이 잘 나와있습니다.
하지만 가상함수 호출 메커니즘은 구현체에 따라 다르게 정의하는 부분이므로 책에 나온 방식대로만 한다고 말할 수 없습니다.
심지어 가상함수 테이블을 쓴다는 보장도 없고요
표준에서는 가상함수가 어떻게 구현되고 어떻게
표준에서는 가상함수가 어떻게 구현되고 어떻게 호출되는지 명시하고 있지 않습니다.
꼭 필요하다면 컴파일러 메뉴얼과 ABI문서를 찾아보셔야 합니다.
제가 아는 상식선에서 컴파일러 구현은..
컴파일러 구현마다 다르겠지만
제가 아는 상식선에서 컴파일러 구현은 다음과 같습니다.
가상 함수 1개당 함수 포인터 1개를 내부적으로 가지고 있고
생성자를 호출 할 때 동적으로 바인딩.
가상 함수 개수만큼 테이블을 가집니다. 상속 하고있는 클래스의 개수와는 상관없습니다.
NVI(Non-Virtual Interface) 패턴 보시면 가상 함수 구현이 대충 어떻게 되는지 이해하기 쉬울거라 생각합니다.
NVI 패턴은 앞에 분이 언급해주신 Effective C++ 항목 35를 참조하세요.
댓글 달기