작성
·
665
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 힙 매니저가 자식 객체를 가리키는 포인터 였을 때 가졌던 메모리 주소의 범위(?)를 기억하기 때문에, 부모 객체로 업캐스팅 된 이후에도 자식 객체가 사용했던 부분을 계속해서 기억하고 값을 유지하는 것일 것 같다는 생각이 듭니다...
절대 아닙니다! 그 정도로 런타임에 똑똑하게 동작하진 않구요.
어떤 타입으로 바라보느냐에 따라 사용할 수 있는 범위가 한정될 뿐이지
원본 데이터는 느긋하게 잘 살아 있습니다.