C++ Override, Final

2021. 3. 20. 17:42·C++/Class

Override, Final

Override

  • 부모 클래스에서 virtual로 선언한 함수를 자식 클래스에서 오버라이딩한다는 의미의 키워드이다.

    • 컴파일러는 프로그래머의 의도를 정확하게 알 수 없기 때문에, 다음과 같이 프로그래머가 실수할 수 있는 상황이 생긴다.

예제

  • print 함수를 오버라이딩하려는데, 실수로 파라미터를 int가 아닌 short로 작성한 상황이다.

    #include <iostream>
    
    class A
    {
    public:
      virtual void print(int x)
      {
        std::cout << "A" << std::endl;
      }
    };
    
    class B : public A
    {
    public:
      void print(short x)
      {
        std::cout << "B" << std::endl;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      A    a;
      B    b;
    
      A&    ref = b;
      ref.print(1);
    }
    
    /* stdout
    A
    */
  • 이럴 때 함수의 body 앞에 override 키워드를 사용하면 컴파일러에서 감지할 수 있다.

    #include <iostream>
    
    class A
    {
    public:
      virtual void print(int x)
      {
        std::cout << "A" << std::endl;
      }
    };
    
    class B : public A
    {
    public:
      void print(short x) override  // 에러
      {
        std::cout << "B" << std::endl;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      A    a;
      B    b;
    
      A&    ref = b;
      ref.print(1);
    }
    error C3668: 'B::print': method with override specifier 'override' did not override any base class methods

Final

  • override처럼 함수의 body 전에 final 키워드를 붙이면, 자식 클래스에서 오버라이딩하지 않는다는 뜻으로 간주한다.

    • 만약 final 키워드를 작성했는데 자식 클래스에서 오버라이딩할 경우, 에러가 발생한다.
    #include <iostream>
    
    class A
    {
    public:
      virtual void print()
      {
        std::cout << "A" << std::endl;
      }
    };
    
    class B : public A
    {
    public:
      void print() final
      {
        std::cout << "B" << std::endl;
      }
    };
    
    class C : public B
    {
    public:
      virtual void print()  // 에러
      {
        std::cout << "C" << std::endl;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      A    a;
      B    b;
    
      A&    ref = b;
      ref.print();
    }
    error C3248: 'B::print': function declared as 'final' cannot be overridden by 'C::print'
저작자표시 (새창열림)

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

C++ 가상 소멸자  (0) 2021.03.20
C++ 공변 반환형(Covariant Return Type)  (0) 2021.03.20
C++ 가상 함수와 다형성 (virtual)  (0) 2021.03.20
C++ 다형성의 기본 개념  (0) 2021.03.20
C++ 다형성 (Polymorphism)  (0) 2021.03.20
'C++/Class' 카테고리의 다른 글
  • C++ 가상 소멸자
  • C++ 공변 반환형(Covariant Return Type)
  • C++ 가상 함수와 다형성 (virtual)
  • C++ 다형성의 기본 개념
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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Caniro
C++ Override, Final
상단으로

티스토리툴바