C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[45094] Re:다운케스팅 질문...
둘리 [dooly386] 960 읽음    2006-05-26 20:15
자식이 부모를 casting 해서 받을려면 dynamic_cast 로 하지 마시고
a = (A *)b;  이렇게 직접 casting 하세요.
아래의 경우 메모리 자체가 B 즉 부모이기 때문에 자식이 해당 메모리를 연결하면 문제가 있게되죠..
이런 경우를 생각해보죠...
class A
{
   int a;
}
class B : public A
{
  int b;
}

B는 A 를 상속받은거죠..
A *a = new A();
즉 a 가 메모리에 잡혔죠...
B *b = dynamic_cast< A*>(a);

이럴경우 *b 는 A 의 a 가 있고 자기 자신의 b 도 있게되죠.
그런데 메모리 구조적으로 b->b 가 과연 어디에 놓여야 될까요?
난감한것이죠..
이런 이유에서 dynamic_cast 는 NULL 을 보내는 것 입니다.
B를 잡고 이를 A로 보냈다가 다시 B로 오면 문제가 없겠죠..
그러나 코딩 하신것은 A(부모)를 잡고 B(자식)로 바로 보낸거라 메모리상의 불균형이 발생할 수 있습니다. (설명상으로 A B가 서로 바뀌었네요.^^)

무조건 쑤셔(???) 넣으시려면 B *b = (B *)a; 이렇게 직접 해당 type으로 캐스팅을 하셔야 됩니다.
C++ 이 무대포(?)로 메모리 처리하는 언어라......

2번째 질문내용은 정확히 어떻게 코딩을 하셨는지 모르겠군요..virtual function을 사용하시려고
하는건지 아니면 그런 의도가 아닌데 에러가 나왔다는건지 모르겠네요...



잠스터 님이 쓰신 글 :
: 1.
: 클래스 A(자식)가 B(부모)를 상속받았다고 가정했을 때,
: A* a = NULL;
: B* b = new B();
: a = dynamic_cast<A*>(b);
: 이렇게 자식 타입이 부모를 다운케스팅했는데 NULL이 들어 옵니다.
: 어떤 경우에 케스팅이 되고 어떤 경우에 안되는지 궁금합니다.
: 덩치가 큰 클래스들을 다운케스팅을 해서 자주 쓰는데 NULL이 들어온 적은 없었거덩요..
: 간단한 테스트를 하다가 문뜩 NULL이 나오길래 질문올립니다.
:
: 2.
: 자식 타입이 부모를 다운케스팅받게 해놓고 컴파일을 했는데
: 부모 클래스 is not a defined class with virtual fuctions. 이렇게 에러를 띄웁니다.
: 자식 타입이 부모를 받을 때 부모의 함수중에는 반드시 가상 함수가 존재해야 하나요?
: 왜 이런지 궁금합니다.
:
: 답변 부탁드릴께요...

+ -

관련 글 리스트
45085 다운케스팅 질문... 잠스터 918 2006/05/26
45094     Re:다운케스팅 질문... 둘리 960 2006/05/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.