type casting
cast 들의 차이와 원리
- C스타일 캐스트 : const 제거 -> static -> reinterpret 순서대로 진행
- const_cast : const나 volatile 키워드 추가, 제거. 사실 만약 함수에서 요구하더라도 함수를 변경해야하지, 실제로는 사용하지 않는게 일반적으론 맞지만, 서드파티 라이브러리 등 어쩔 수 없는 경우가 있다.
- 묵시적 형변환
- 정수형 <-> 부동소숫점
- T* -> void*
- 업캐스팅
- Enum -> int
- static_cast : 컴파일타임에 의미가 있는 형변환을 한다.
- 묵시적 형변환으로 가능한것들
- void* -> T*
- int -> Enum : 대신 값 범위는 보장되지 않음
- 다운캐스팅 : 대신 런타임체크가 없어서 안전하진 않음
- reinterpret_cast : 완전한 강제 형변환을 한다.
- const_cast나 static_cast에서 되는것들은 reinterpret_cast에서 안된다
- int* <-> double* : 이런 완전 다른 타입도 강제 형변환 가능. static_cast는 에러가 발생한다.
- dynamic_cast : 런타임에 다운캐스팅 타입 안정성을 보장해줌.
- 실패시 포인터는 널포인터, 레퍼런스는 예외발생
C style 형변환
묵시적 형변환
const_cast
static_cast
reinterpret_cast
dynamic_cast
무조건적으로 되는거 아님
dynamic_cast의 원리는 vtable을 참조해서 RTTI 객체를 확인하는 것이기 떄문에 폴리모픽된 클래스(virtual 이 하나라도 포함된 클래스)에 대해서만 지원한다.
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
RTTI를 끄고 dynamic_cast를 직접 구현?