inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

170

rcc24

작성한 질문수 5

0

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

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

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

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

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

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

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

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

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

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

C++

답변 1

0

Rookiss

가상함수 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