본문 바로가기

예전/C, C++

[C++] dynamic_cast

dynamic casting 은 상속관계 내의 downcasting에 사용된다. 



[예제 1]



출력:Go Dog


1)과 3)은 자신의 객체를 할당한 것이고, 2) 는 부모 객체에 자식 객체를 할당한 것이다.


위에서 부터 보면 자식의 객체에 부모 객체를 넣으려고 한다. 

그러나 아래와 같은 에러를 생성하고 실ㅋ패


error C2440: '=' : 'Animal *'에서 'Dog *'(으)로 변환할 수 없습니다.

1>          기본 형식에서 파생 형식으로 캐스팅하려면 dynamic_cast 또는 static_cast가 필요합니다.


그래서 그 에러 말대로 dynamic_cast를 넣어보았다. 하지만 런타임 에러!! 

왜냐하면 pDog와 pAnimal이 가리키는 타입이 다르기 때문이다. 

dynamic_cast는 포인터나 참조자의 타입을 downcasting하는 것이지 객체의 타입을 casting하지는 못한다.


dynamic_cast는 casting에 실패할 때 대상이 pointer라면 NULL을 리턴하고, 참조자라면 bad_cast를 던진다. 

이것이 안전한 타입의 캐스팅을 의미한다. 


굵은 부분에서 dynamic_cast 의 기본 동작을 볼 수 있다. 

둘다 Animal객체 인데 위와는 달리 굵은 부분에서 casting이 성공한 이유는

pAnimal 은 new Animal로 객체화되었고, pDog1은 new Dog로 객체화 되었기 때문이다.


마지막 pDog = pDog2 는 당연히 성공



[예제 2]



출력:Go miso


첫번째는 당연히 에러를 발생시킨다. 


error C2440: '=' : 'Female *'에서 'Person *'(으)로 변환할 수 없습니다.

1>          가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.


[예제 2]의 굵은 부분을 보면 한 클래스가 다중상속한 일반 클래스 사이에도 dynamic_cast가 가능하다는 것을 볼 수 있다. 

[예제 1]의 경우 downcasting이라고 하고, [예제 2]는 crosscasting 이라고 한다. 




틀린것을 알려주시면 정말 감사하겠어요'ㅅ ')/



[참조] http://prostars.net/55


'예전 > C, C++' 카테고리의 다른 글

[C] memmove와 memcopy  (0) 2013.08.24
[C++] reinterpret_cast  (0) 2013.08.23
[C++] const_cast  (0) 2013.08.21
[C++] static_cast  (0) 2013.08.21
[C++] casting 연산자  (0) 2013.08.21