가상함수 관련한 질문입니다
170
작성한 질문수 5
안녕하세요? 가상함수 테이블과 호출 함수 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 포인터를 전달하기 위해
추가 정보가 필요하기 때문입니다.
이 부분은 사실 몰라도 딱히 상관 없습니다.
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
541
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
442
1
strcpy() 구현 관련 질문
0
513
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
452
1
클래스 타입의 포인터 질문합니다
0
546
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
497
1
템플릿 특수화 관련 질문
0
384
1
포인터 관련 질문합니다!
0
263
1
Unable to start assembler. Check your settings.
0
830
2
cpu선택
0
539
1
포인터 질문이 있습니다
0
323
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
584
1
iterator 삭제관련
0
406
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
310
1
15 분 45초 대 질문
0
308
0
스택 프레임 질문합니다!
2
306
1
오른값 참조 in 게임
0
384
0
동적할당 질문이 있습니다
0
449
1
안녕하세요 메모리에 대해 질문드립니다.
0
304
1
함수객체 의 매개변수
0
358
1
복사생성자
0
434
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
420
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
354
1
스택 오버플로우
2
790
1





