C++ Override, Final

2021. 3. 20. 17:42·SW개발/C++
반응형

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'
반응형
저작자표시 (새창열림)

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

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
'SW개발/C++' 카테고리의 다른 글
  • C++ 가상 소멸자
  • C++ 공변 반환형(Covariant Return Type)
  • C++ 가상 함수와 다형성 (virtual)
  • C++ 다형성의 기본 개념
Caniro
Caniro
  • Caniro
    Minimalism
    Caniro
  • 전체
    오늘
    어제
    • 전체보기 (318)
      • 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(개발아님) (45)
        • Windows (25)
        • MacOS (7)
        • Utility (11)
      • 챗봇 짬통 (0)
      • 일상 (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바