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

2021. 3. 21. 23:54·C++/Class

동적 형변환 (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
    */
저작자표시 (새창열림)

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

C++ 유도 클래스에서 출력 연산자 사용하기  (0) 2021.03.21
C++ 객체 잘림 (Object Slicing)  (0) 2021.03.21
C++ 다이아몬드 상속 (Diamond Polymorphism)  (0) 2021.03.21
C++ 인터페이스 클래스 (Interface Class)  (0) 2021.03.21
C++ 추상 기본 클래스 (Abstract class)  (0) 2021.03.21
'C++/Class' 카테고리의 다른 글
  • C++ 유도 클래스에서 출력 연산자 사용하기
  • C++ 객체 잘림 (Object Slicing)
  • C++ 다이아몬드 상속 (Diamond Polymorphism)
  • C++ 인터페이스 클래스 (Interface Class)
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 분류 전체보기 (317)
      • Algorithm (13)
        • 알기 쉬운 알고리즘 (10)
        • Search (1)
        • Sort (2)
      • Arduino (0)
      • C++ (185)
        • Class (46)
        • Exception (6)
        • Library (51)
        • Overloading (10)
        • SmartPointer (5)
        • Syntax (33)
        • TBC++ (23)
        • Templates (9)
        • VisualStudio (2)
      • Embedded (1)
      • Git (4)
      • Java (5)
      • Linux (16)
        • Error (1)
        • Linux Structure (11)
      • MacOS (7)
      • OS (1)
        • Concurrency (1)
      • Python (21)
        • Class (1)
        • Function (2)
        • Syntax (17)
      • Raspberrypi (9)
      • Review (1)
      • Utility (12)
        • VSCode (5)
        • VirtualBox (3)
      • Web (8)
        • Nginx (1)
        • React (3)
        • Django (1)
      • Windows (20)
        • Registry (3)
        • WSL (1)
        • DeviceDriver (6)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바