|
자식이 부모를 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. 이렇게 에러를 띄웁니다.
: 자식 타입이 부모를 받을 때 부모의 함수중에는 반드시 가상 함수가 존재해야 하나요?
: 왜 이런지 궁금합니다.
:
: 답변 부탁드릴께요...
|