부모 클래스의 포인터에서 자식 클래스의 포인터로 안전한 다운 캐스팅 해주는 연산자
런타임 도중 안전한 형 변환 제공
up casting = 자식 -> 부모 로 형변환
down casting = 부모 -> 자식 으로 형변환dynamic_cast<바꾸려는 새로운 타입>(대상)
성공할 경우 : new_type의 value를 return 합니다.
실패할 경우(new_type = pointer) : null pointer
실패할 경우(new_type = reference) : bad_cast (exception 처리됩니다.)
#include <iostream>
using namespace std;
class Parent {
public:
virtual ~Parent(){}
};
class Child : public Parent {
public:
void func() {
cout << "func" << endl;
}
};
void foo(Parent* p) {
Child* child = dynamic_cast<Child*>(p);
if (child != nullptr)
child->func();
}
int main() {
Parent* p = new Child;
foo(p);
}
func
class Parent {
};
다형 클래스 형식이어야 사용 가능(virtaul 함수가 있어야 사용 가능)
#include <iostream>
using namespace std;
class A {
public:
virtual ~A(){}
};
class B0 : public A {
};
class B1 : public A {
};
class C : public B0, public B1 {
};
int main() {
C c;
B0* b0 = &c;
B1* b1 = dynamic_cast<B1*>(b0);
}
sibling(형제)관계라면 크로스 캐스팅이 된다.