다른 캐스트와 다른 가장 큰 특징은 실행 시간에 캐스트가 된나는 것이다. 즉, 컴파일 때 캐스트 되지 않는다는 것이다.
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
는 성공하지만, 자식 간 캐스팅을 실패한 것을 확인할 수 있다.