dynamic casting

😎·2023년 1월 14일
0

CPP

목록 보기
35/46

dynamic_cast

다른 캐스트와 다른 가장 큰 특징은 실행 시간에 캐스트가 된나는 것이다. 즉, 컴파일 때 캐스트 되지 않는다는 것이다.

  • 다형성 객체에만 사용한다.
  • downcast 할 때만 사용한다.
    이때 부모와 자식 사이의 캐스팅인지 확인한다. 부모 자식 간의 캐스팅이 아니라면 dynamic cast 가 불가능하다.
  • 포인터나 참조에만 사용 가능하다.
  • 포인터에 참조를 참조
#include <iostream>
#include <typeinfo>
#include <exception>

class Parent {public: virtual ~Parent(void) {}};
class Child1 : public Parent {};
class Child2 : public Parent {};

int main(void) {
  Child1  a;
  Parent *b = &a; // Implicit upcast -> Ok

  //Explicit downcast 부모와 자식간의 캐스팅 -> 성공
  Child1 *c = dynamic_cast<Child1 *>(b);
  if ( c == NULL ) {
    std::cout << "conversion is NOT Ok" << std::endl;
  }
  else {
    std::cout << "conversion is Ok" << std::endl;
  }

  //Explicit downcast 자식 간의 캐스팅 -> 실패
  try {
    Child2 &d = dynamic_cast<Child2 &>(*b);
    std::cout << "conversion is Ok" << std::endl;
  } catch (std::bad_cast &bc) {
    std::cout << "conversion is NOT Ok: " << bc.what() << std::endl;
    return 0;
  }
  return 0;
}

이미지의 터미널 부분을 보면 부모 자식 간의 캐스팅에서 dynamic cast 는 성공하지만, 자식 간 캐스팅을 실패한 것을 확인할 수 있다.

profile
jaekim

0개의 댓글