C++ Override, Final

2021. 3. 20. 17:42·SW개발/C++
목차
  1. Override
  2. 예제
  3. Final
반응형

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
  1. Override
  2. 예제
  3. Final
'SW개발/C++' 카테고리의 다른 글
  • C++ 가상 소멸자
  • C++ 공변 반환형(Covariant Return Type)
  • C++ 가상 함수와 다형성 (virtual)
  • C++ 다형성의 기본 개념
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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.