upcast / downcast
- upcast : 이것은 흔히 우리가 알고 있는 type cast 이다. 그러니까 child class 에서 parent class 로의 type cast 이다.
- downcast : 이것은 이름에서도 알 수 있듯이 up cast 의 반대이다. 그러니까 parent class 인 녀석을 child class 로 변환하는 것이다.
c++ 에서 제공하는 cast 연산자 4개
dynamic_cast
- dynamic_cast : downcast 에 쓰인다. (상속 관계에 있는 type 끼리의 cast 에 쓰인다.)
dynamic_cast<type_id>(expression)
상속관계에 있는 type 을 cast 할 때 쓰인다.
expression 가 type_id의 base class 라면, expression 이 실제로 type-id 의 object 인지를 run-time 에 check 를 하게 된다. 그래서 실제로 expression 이 type-id 의 object 라면, cast 를 해준다.
아래 예로 설명을 하면, 'pa' 가 실제로 class B type 인지를 확인하고, 'pa' 가 실제로 class B type 이라면 class B type 으로 변경해준다. 하지만 그렇지 않다면, 변경하지 않는다.
class A ... class B: public A // extends A ... class C: public B // extends B ... A* pa = new B; // unclear but ok A* pa2 = new A; B* pb = dynamic_cast<B*>(pa); // ok: pb actually points to a B B* pb2 = dynamic_cast<B*>(pa2); // pb2 points to a A not a B
reinterpret_cast
- 안되는 cast : const type --> other type
const_cast
이녀석은 const 를 주고, 뺐는 cast 를 한다.
- const type --> non-const type(volatile)
- non-const type --> const type
static_cast
대부분의 cast 를 행한다. 다만- pointer 의 type 변환은 reinterpret_cast 가 한다. (void* 는 static_cast 로 가능하다)
- 그리고 const 속성은 const_cast 가 한다.
- 그러니 이것 빼고 대부분은 이것을 사용하면 된다.
그리고 추가적으로 static_cast 는 void* 으로의 cast 는 자유롭다. 그래서 void* 를 통해서 새로운 pointer type 으로 변경해서 reinterpret_cast 와 같은 기능을 할 수도 있다.
References
- dynamic_cast Operator
- I'm Prostars :: C++ 이야기 - [1] 캐스트 연산자 const_cast
- I'm Prostars :: C++ 이야기 - [2] 캐스트 연산자 dynamic_cast
- I'm Prostars :: C++ 이야기 - [3] 캐스트 연산자 static_cast
- I'm Prostars :: C++ 이야기 - [4] 캐스트 연산자 reinterpret_cast
댓글 없음:
댓글 쓰기