작성
·
146
0
안녕하세요? 가상함수 테이블과 호출 함수 mapping에 대한 질문입니다.
가상함수 테이블을 통해서 호출할 함수를 결정하려고 한다 하더라도
어떤 타입의 객체가 호출을 했는지 알아야 할텐데 그건 어떻게 알 수 있게 되나요?
가령 부모클래스에서 virtual로 선언된 test(){}라는 함수가 있다고 하고
자식 클래스에서 해당 함수를 오버라이드 한 이후에
Parent* p = new Child; p->test();를 실행하게 되면
가상함수 테이블에는 부모의 test와 자식의 test 모두 들어가 있게 되고
런타임 시에 자식의 test 함수를 찾아서 call하게 될텐데
test를 호출한 타입이 Parent인지 Child인지는 어떻게 결정할 수 있게 되는건지 궁금합니다.
답변 부탁드릴께요. 좋은 강의 감사합니다.
답변 1
0
가상함수 test 함수 내부에서는,
자신을 호출한 주체가 Parent인지 Child인지 알지 못하고
만약에 Parent/Child 여부에 따라 코드가 분기되어야 한다면
다시 dynamic_cast 라거나, 멤버 타입으로 오브젝트의 _type을 남겨서 분기해야 합니다.
따라서 당장 타입을 결정해서 호출하는 개념은 아닙니다.
그럼에도 질문이 날카롭네요.
매우 디테일에 해당하는 내용이지만
멤버 함수 포인터는 4 or 8바이트가 아니라 훨씬 더 복잡하게 되어 있습니다.
왜냐하면 다중 상속을 고려하면, this 포인터를 전달하기 위해
추가 정보가 필요하기 때문입니다.
이 부분은 사실 몰라도 딱히 상관 없습니다.