상세 컨텐츠

본문 제목

캐스팅 관련 연산자((), dynamic_cast<>)

C++/형변환

by nowpassion 2008. 5. 11. 00:16

본문

1. C언어에서의 형변환
- 기본적으로 ()를 사용하여 형변환을 합니다.
- 대부분의 형변환을 할 수 있습니다.
ex1) 50-1.c
사용자 삽입 이미지











- 실행결과
사용자 삽입 이미지











2. dynamic_cast<>

-  상속관계 안에서 포인터나 참조의 타입을 기본클래스에서 파생클래스로 다운캐스팅
    할 수 있습니다.
- 다중상속에서 기본클래스간의 캐스팅을 지원합니다.
- 다형성과 관계있기 때문에 virtual함수가 하나 이상 있어야 됩니다.
예제) 50-3.cpp
사용자 삽입 이미지

  - 컴파일 결과
사용자 삽입 이미지

 - 컴파일 결과에서도 나오듯이 다형성이 아니다해서 에러를 발생 시키는 것을 볼 수 있습니다.
 - 그럼 virtual 선언을 하고 컴파일을 다시 해보겠습니다.

예제)50-5.cpp
사용자 삽입 이미지

- 실행 결과
사용자 삽입 이미지


 

 












- 위의 결과를 보면 실제 기본클래스(Shape)를 파생클래스(Point)로 캐스팅해서 포인터를
   지정할려고 했으나(34~35) 0(NULL)포인터를 반환해버립니다. 이런것을 봐서는 실제 객체의
   타입을 가지고 변환하는 것이 아니라 포인터 자체만 변경하므로 실제로 할당하지 못하기 때문에
   NULL포인터를 반환하는 것 같습니다.
   (실제로 파생클래스의 포인터에  기본클래스를 할당할 수는 없죠?)

- 위 결과를 받쳐주는 결과가 바로 37~38번째 줄입니다. pPoint1의 포인트 형이 Shape라고 해도
  실제 형태는 Point형이므로 포인터에 할당할 수 있습니다.

- 다중상속 관계에서의 캐스팅 : 비슷한 경우기는 하지만 실제 다중상속관계에서도 허용되는
   캐스팅을 나타내고 있습니다. 이것도 위의 경우와 같이 포인터 자체만 캐스팅 되므로
   캐스팅 후 할당 가능 여부에 따라 결과값이 달라집니다.

예제)50-7.cpp
사용자 삽입 이미지

 

































- 실행결과
사용자 삽입 이미지








'C++ > 형변환' 카테고리의 다른 글

static_cast<>  (0) 2008.05.11
const_cast<>, reinterpret_cast<>연산자  (0) 2008.05.11
RTTI(Run-Time Type Information)  (0) 2008.05.11

관련글 더보기