inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

타입 변환 #5

업캐스팅 후 다운캐스팅 과정 질문입니다.

733

공부가제일쉬웠어요

작성한 질문수 6

1

안녕하세요 강사님!

자식에서 부모로 업캐스팅 한 경우, 자식 객체에서만 존재했던
멤버 변수들은 그대로 남아있게 되는건가요?
사실상 부모 포인터가 가리키게 되도록 캐스팅이 되니까,

부모가 가진 멤버 변수들 이외에 자식이 가지고 있던 주소들은
다른 부분에서 쓰레기 값이라고 판단하고 마음대로 쓸 가능성이 있는건지 아닌 것인지 이 부분이 이해가 잘 안됩니다 ...

아직 헷갈리는 점이 많지만, 제가 이해한 바로는 ... ...

업캐스팅 된 이후에도 CRT 힙 매니저가 자식 객체를 가리키는 포인터 였을 때 가졌던 메모리 주소의 범위(?)를 기억하기 때문에, 부모 객체로 업캐스팅 된 이후에도 자식 객체가 사용했던 부분을 계속해서 기억하고 값을 유지하는 것일 것 같다는 생각이 듭니다... 

혹시 이게 맞나요???

 

C++

답변 1

0

Rookiss

class Knight : public Player
{
}

이라고 가정하고,

Knight k;
Player p = k;

와 같이 한다면 실제로 Knight의 일부분이 손실되고
Player과 동일하게 있는 데이터만 복사됩니다.

하지만 포인터를 기준으로
Knight* k = new Knight();
Player* p = k;

를 한다면, 아무일도 일어나지 않습니다.
힙 메모리에 들어가 있는 Knight 객체는 여전히 얌전히 잘 있는 상태이고
이것을 p라는 포인터로 가리키고 있을 뿐이죠.

업캐스팅 된 이후에도 CRT 힙 매니저가 자식 객체를 가리키는 포인터 였을 때 가졌던 메모리 주소의 범위(?)를 기억하기 때문에, 부모 객체로 업캐스팅 된 이후에도 자식 객체가 사용했던 부분을 계속해서 기억하고 값을 유지하는 것일 것 같다는 생각이 듭니다... 

절대 아닙니다! 그 정도로 런타임에 똑똑하게 동작하진 않구요.
어떤 타입으로 바라보느냐에 따라 사용할 수 있는 범위가 한정될 뿐이지
원본 데이터는 느긋하게 잘 살아 있습니다.




visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

559

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

453

1

strcpy() 구현 관련 질문

0

534

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

475

1

클래스 타입의 포인터 질문합니다

0

559

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

503

1

템플릿 특수화 관련 질문

0

389

1

포인터 관련 질문합니다!

0

270

1

Unable to start assembler. Check your settings.

0

848

2

cpu선택

0

548

1

포인터 질문이 있습니다

0

331

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

589

1

iterator 삭제관련

0

415

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

317

0

스택 프레임 질문합니다!

2

312

1

오른값 참조 in 게임

0

391

0

동적할당 질문이 있습니다

0

457

1

안녕하세요 메모리에 대해 질문드립니다.

0

312

1

함수객체 의 매개변수

0

365

1

복사생성자

0

439

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

430

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

359

1

스택 오버플로우

2

801

1