본문 바로가기
::public/C++

dynamic_cast

by 해맑은욱 2020. 12. 11.

런타임 시점에 캐스팅을 진행, 성공할 경우 주소값을 반환.

캐스팅에 실패할 경우 nullptr을 반환.

 

#include <iostream>
 
using std::cout;
using std::endl;
 
 
class Parent
{
public:
    virtual ~Parent() {}
};
 
 
class Child : public Parent
{
public:
    void func()
    {
        cout << "func" << endl;
    }
};
 
 
void func0(Parent* p)
{
    // 상속 관계에 대한 변환 지원, virtual 함수가 한 개라도 있어야 dynamic_cast가 사용 가능
    // p가 실제로 Parent이면 정의되지 않은 행동
    //Child* child = dynamic_cast<Child*>(p); 
    //child->func();
 
    Child* child = dynamic_cast<Child*>(p);  // downcasting
    if (child != nullptr)
    {
        child->func();
    }
 
    // if 내 선언 활용
    if (Child* child = dynamic_cast<Child*>(p)) // downcasting
        child->func();
}
 
 
void func1(Parent* p)
{
    // p가 Child가 아닌 경우 예외가 발생, 추후 try catch 활용
    Child& child = dynamic_cast<Child&>(*p); //downcasting
    child.func(); 
}
 
int main()
{
    Parent* p = new Parent;
    func0(p);
    func1(p);
 
    // upcasting, 자식으로 부모로 변환 (암시적)
    // downcasting, 부모를 자식으로 변환 (명시적, 위험할 수 있음)
}
cs

'::public > C++' 카테고리의 다른 글

C 스타일함수 스타일 변환  (0) 2020.12.14
reinterpreter_cast  (0) 2020.12.11
const_cast  (0) 2020.12.11
static_cast  (0) 2020.12.11
형 변환 규칙  (0) 2020.12.11