버그 해결을 위한 모든 질문을 던져
0 votes
242 views

안녕하세요. ^^

 

다형성에 대해 정리하던 중 궁금한 사항이 생겨 이곳에 질문합니다.

 

질문은, C++에서 가상함수가 호출되는 과정을 자세히 알고 싶습니다.

 

Main함수가 Virtual 함수를 호출하면 호출된 함수가 Virtual 이란 것을 알고

 

그 Virtual 함수를 Override 하고 있는 다른 함수들이 적혀져 있는 어떤 테이블에가서

 

정의 되어있는 함수가 있는지 확인하고 실제론 그 함수를 호출한다고 알고있는데

 

여기서 Override 하고 있는 다른 함수들이 적혀져 있는 어떤 테이블의 이름이 궁금하고

 

실제로 저렇게 호출이 되는 것인지 자세히 알고 싶습니다.

 

감사합니다.

asked (29 point) , 242 views
virtual 이 적힌 클래스는 클래스에 대응되는 가상 함수 테이블이 생깁니다.

이 테이블은 클래스의 virtual 함수를 가르키는 함수 포인터들이 모인 공간입니다.

 

해당 클래스가 인스턴싱 될때 vitrual 된 함수의 포인터를 가상함수테이블에서 가져와 등록하고

함수가 호출될때 인스턴스가 가지고 있는 함수 포인터를 호출합니다.

 

특히 다형성을 위해 상속받은 클래스 또한 가상함수테이블이 따로 생성됩니다.

 

면접자리에서 자주 질문하는 내용이라 제가 기억나는 부분을 말씀드렸는데 혹시나 다른점있으면 수정해주세요!

2 answers

+3 votes
우수 답변
해당 테이블 이름을 보통 vtable이라고 합니다. 대충 다음의 글들을 읽어보시면 마법이 풀릴 것입니다.

C++의 가상 함수 테이블 (vtable)은 언제 생성될까요?
; http://www.sysnet.pe.kr/2/0/11167

C++ vtable의 가상 함수 호출 가로채기
; http://www.sysnet.pe.kr/2/0/11169

C++ 클래스 상속 관계의 vtable 생성 과정
; http://www.sysnet.pe.kr/2/0/11168
answered (50 point)
선택됨
+3 votes

저는 가상함수 테이블이 저장되는 위치만 알려드릴게요.

비주얼 스튜디오에서 중단점(브레이크 포인트) 걸고 Watch 창에서 클래스 포인터를 넣어서 확인해 보시면, 다음과 같이 보입니다.

__vfptr 이 가상함수테이블입니다. (비주얼 c++은 이런 식이고, gcc등 다른 c++ 컴파일러는 다를 수 있습니다.)

소스코드는 아래와 같음..


class Parent
{
public:
	Parent() {}
	virtual ~Parent() {}

	virtual void FunctionA() {}
	virtual void FunctionB() {}
};

class Child : public Parent
{
public:
	Child() {}
	virtual ~Child() {}

	virtual void FunctionB() {}
};

int main()
{
	Child* pObj = new Child();

	pObj->FunctionA();

	delete pObj;

    return 0;
}

 

 

answered (453 point)
수정됨

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

186 질문
289 answers
314 댓글
307 users