- 상속관계에서의 안전한 형 변환
- 기초 클래스의 포인터 형을 유도 클래스의 포인터 형으로 형 변환하는 것은 일반적인 경우의 형 변환이 아니다.
- 상속관계에 있는 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환한다.
- 컴파일 시간이 아닌 실행시간에 안전성을 검사하도록 컴파일러가 바이너리 코드를 생성한다.
- <> 사이에 변환하고자 하는 자료형의 이름을 두되, 객체의 포인터 또는 참조형이 와야 하며, () 사이에는 변환의 대상이 와야 한다.
- 요구한 형 변환이 적절하지 않은 경우에는 컴파일 시 에러가 발생한다.
// A <- B일 때
A * a = new B();
B * b = dynamic_cast<B*>(a); // 컴파일 에러
A * a = new a();
B * b = dynamic_cast<B*>(a); // 컴파일 에러
B * b = new B();
A * a = dynamic_cast<A*>(b); // 컴파일 OK
- A타입에서 B타입으로 변환한다.
- 기본 자료형 간의 형 변환에서 사용된다.
- 클래스의 상속관계에서의 형 변환에서 사용된다.
- 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 뿐만 아니라, 기초 클래스의 포인터 및 참조형 데이터도 유도 클래스의 포인터 및 참조형 데이터로 아무런 조건 없이 형 변환할 수 있다.
- dynamic_cast 연산자와 달리보다 많은 형 변환을 허용한다.
- 형 변환으로 인한 책임도 프로그래머가 져야 한다.
- const의 성향을 삭제한다.
- const 선언으로 인한 형의 불일치가 발생해서 인자의 전달이 불가능한 경우에 유용하게 사용이 된다.
- 상관없는 자료형으로의 형 변환. 결과는 예측하지 못한다.
- 포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환을 허용한다.
int num=72;
int * ptr = #
int adr=reinterpret_cast<int>(ptr); //주소 값을 정수로 변환
cout<<"Addr : "<<adr<<endl; //주소 값 출력
int * rptr = reinterpret_cast<int*>(adr); //정수를 다시 주소 값으로 변환
cout<<"value: "<<*rptr<<endl; // 주소값에 저장된 정수 출력
상속관계에 놓여있는 두 클래스 사이
- 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환할 경우에는 dynamic_cast 연산자를 사용한다.
- 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형 데이터로 형 변환할 경우에는 static_cast 연산자를 사용한다.
- dynamic_cast 연산자도 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형으로의 형 변환을 허용한다. 단, 기초 클래스가 Polymorphic1) 클래스일 때만 허용한다.
- 하나 이상의 가상 함수를 지니는 클래스