C++ 동적 형변환 (Dynamic Casting)

2021. 3. 21. 23:54·SW개발/C++
반응형

동적 형변환 (Dynamic Casting)

  • dynamic_cast는 캐스팅이 실패하면 nullptr를 반환한다.

예제

  • 간단한 예제

    #include <iostream>
    
    class Base
    {
    public:
      int    i_ = 0;
    
      virtual void print()
      {
        std::cout << "I'm Base\n";
      }
    };
    
    class Derived1 : public Base
    {
    public:
      int    j_ = 1024;
    
      virtual void print() override
      {
        std::cout << "I'm Derived\n";
      }
    };
    
    int            main()
    {
      using namespace std;
    
      Derived1    d1;
      Base*        base = &d1;
    
      d1.j_ *= 2;
    
      auto*        base_to_d1 = dynamic_cast<Derived1*>(base);
      cout << base_to_d1->j_ << endl;
      base_to_d1->j_ /= 8;
    
      cout << d1.j_ << endl;
    }
    
    /* stdout
    2048
    256
    */

  • 캐스팅 실패 예제

    #include <iostream>
    
    class Base
    {
    public:
      int    i_ = 0;
    
      virtual void print()
      {
        std::cout << "I'm Base\n";
      }
    };
    
    class Derived1 : public Base
    {
    public:
      int    j_ = 1024;
    
      virtual void print() override
      {
        std::cout << "I'm Derived\n";
      }
    };
    
    class Derived2 : public Base
    {
    public:
      std::string    name_ = "Dr. Two";
    
      virtual void print() override
      {
        std::cout << "I'm Derived\n";
      }
    };
    
    int            main()
    {
      using namespace std;
    
      Derived1    d1;
      Base*        base = &d1;
    
      d1.j_ *= 2;
    
      auto*        base_to_d1 = dynamic_cast<Derived2*>(base);
      if (base_to_d1 != nullptr)
        base_to_d1->print();
      else
        cout << "Failed to cast\n";
    }
    
    /* stdout
    Failed to cast
    */

정적 형변환 (Static Casting)

  • 최대한 변환되도록 캐스팅한다.

  • 위의 경우 가급적 Dynamic Casting을 사용하는게 안전하다.

    #include <iostream>
    
    class Base
    {
    public:
      int    i_ = 0;
    
      virtual void print()
      {
        std::cout << "I'm Base\n";
      }
    };
    
    class Derived1 : public Base
    {
    public:
      int    j_ = 1024;
    
      virtual void print() override
      {
        std::cout << "I'm Derived\n";
      }
    };
    
    class Derived2 : public Base
    {
    public:
      std::string    name_ = "Dr. Two";
    
      virtual void print() override
      {
        std::cout << "I'm Derived\n";
      }
    };
    
    int            main()
    {
      using namespace std;
    
      Derived1    d1;
      Base*        base = &d1;
    
      d1.j_ *= 2;
    
      auto*        base_to_d1 = static_cast<Derived2*>(base);
      if (base_to_d1 != nullptr)
        base_to_d1->print();
      else
        cout << "Failed to cast\n";
    }
    
    /* stdout
    I'm Derived
    */
반응형
저작자표시 (새창열림)

'SW개발 > C++' 카테고리의 다른 글

따라하며 배우는 C++ 13장  (0) 2021.03.21
C++ 유도 클래스에서 출력 연산자 사용하기  (0) 2021.03.21
C++ reference_wrapper  (0) 2021.03.21
C++ 객체 잘림 (Object Slicing)  (0) 2021.03.21
C++ 다이아몬드 상속 (Diamond Polymorphism)  (0) 2021.03.21
'SW개발/C++' 카테고리의 다른 글
  • 따라하며 배우는 C++ 13장
  • C++ 유도 클래스에서 출력 연산자 사용하기
  • C++ reference_wrapper
  • C++ 객체 잘림 (Object Slicing)
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (319)
      • SW개발 (268)
        • Java Spring (6)
        • C++ (186)
        • Python (21)
        • Linux (16)
        • 알고리즘 (13)
        • Git (4)
        • Embedded (1)
        • Raspberrypi (9)
        • React (3)
        • Web (2)
        • Windows Device Driver (6)
      • IT(개발아님) (46)
        • Windows (26)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Solaris 10
    EXCLUDE
    스프링 프레임워크 핵심 기술
    KakaoTalk
    logi options
    윈도우
    vscode
    Workspace
    스프링
    dism
    시스템 복구
    MacOS
    windows
    unix
    그림판
    알림
    mspaint
    SunOS 5.1
    제외
    Windows 11
    로지텍 마우스 제스처
    윈도우 명령어
    spring
    SFC
    java
    citrix workspace
    백기선
    맥북 카카오톡 알림 안뜸
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
C++ 동적 형변환 (Dynamic Casting)
상단으로

티스토리툴바