🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

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

22.02.12 11:06 작성 조회수 564

1

안녕하세요 강사님!

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

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

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

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

혹시 이게 맞나요???

 

답변 1

답변을 작성해보세요.

0

class Knight : public Player
{
}

이라고 가정하고,

Knight k;
Player p = k;

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

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

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

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

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




채널톡 아이콘