인프런 커뮤니티 질문&답변

rcc24님의 프로필 이미지
rcc24

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

가상함수 관련한 질문입니다

작성

·

146

0

안녕하세요? 가상함수 테이블과 호출 함수 mapping에 대한 질문입니다.

가상함수 테이블을 통해서 호출할 함수를 결정하려고 한다 하더라도

어떤 타입의 객체가 호출을 했는지 알아야 할텐데 그건 어떻게 알 수 있게 되나요?

가령 부모클래스에서 virtual로 선언된 test(){}라는 함수가 있다고 하고 

자식 클래스에서 해당 함수를 오버라이드 한 이후에 

Parent* p = new Child;  p->test();를 실행하게 되면 

가상함수 테이블에는 부모의 test와 자식의 test 모두 들어가 있게 되고

런타임 시에 자식의 test 함수를 찾아서 call하게 될텐데

test를 호출한 타입이 Parent인지 Child인지는 어떻게 결정할 수 있게 되는건지 궁금합니다.

답변 부탁드릴께요. 좋은 강의 감사합니다.

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

가상함수 test 함수 내부에서는,
자신을 호출한 주체가 Parent인지 Child인지 알지 못하고
만약에 Parent/Child 여부에 따라 코드가 분기되어야 한다면
다시 dynamic_cast 라거나, 멤버 타입으로 오브젝트의 _type을 남겨서 분기해야 합니다.
따라서 당장 타입을 결정해서 호출하는 개념은 아닙니다.

그럼에도 질문이 날카롭네요.
매우 디테일에 해당하는 내용이지만
멤버 함수 포인터는 4 or 8바이트가 아니라 훨씬 더 복잡하게 되어 있습니다.
왜냐하면 다중 상속을 고려하면, this 포인터를 전달하기 위해
추가 정보가 필요하기 때문입니다.
이 부분은 사실 몰라도 딱히 상관 없습니다.

rcc24님의 프로필 이미지
rcc24

작성한 질문수

질문하기