Namespaces
Variants

override specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Virtual function
override specifier (C++11)
final specifier (C++11)
Special member functions
Templates
Miscellaneous

가상 함수가 다른 가상 함수를 오버라이드 함을 지정합니다.

목차

구문

식별자 override 는 사용되는 경우, 클래스 정의 내부의 멤버 함수 선언 또는 멤버 함수 정의 구문에서 선언자(declarator) 바로 뒤에 나타납니다.

declarator virt-specifier-seq  (선택 사항) pure-specifier  (선택 사항) (1)
declarator virt-specifier-seq  (선택 사항) function-body (2)
1) 멤버 함수 선언에서, override 는 선언자 바로 뒤, virt-specifier-seq 내에 나타날 수 있으며, 사용되는 경우 pure-specifier 앞에 위치합니다.
2) 클래스 정의 내부의 멤버 함수 정의에서, override virt-specifier-seq 에서 선언자 바로 뒤와 function-body 바로 앞에 나타날 수 있습니다.

두 경우 모두, virt-specifier-seq 은, 사용된다면, override 또는 final , 또는 final override 또는 override final 입니다.

설명

멤버 함수 선언 또는 정의에서, override 지정자는 함수가 가상 함수이며 기본 클래스의 가상 함수를 재정의하고 있음을 보장합니다. 이것이 사실이 아닐 경우 프로그램은 형식 오류(컴파일 타임 오류 발생)입니다.

override 는 멤버 함수 선언자 뒤에 사용될 때 특별한 의미를 가진 식별자 입니다; 그 외의 경우에는 예약된 키워드 가 아닙니다.

키워드

override

예제

#include <iostream>
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
// 구조체 A의 멤버 함수 정의:
void A::foo() { std::cout << "A::foo();\n"; }
A::~A() { std::cout << "A::~A();\n"; }
struct B : A
{
//  void foo() const override; // 오류: B::foo가 A::foo를 재정의하지 않음
                               // (시그니처 불일치)
    void foo() override; // OK: B::foo가 A::foo를 재정의함
//  void bar() override; // 오류: A::bar는 가상 함수가 아님
    ~B() override; // OK: `override`는 가상 특수 멤버 함수에도 적용 가능
                   // (예: 소멸자)
    void override(); // OK, 멤버 함수 이름이며 예약된 키워드가 아님
};
// 구조체 B의 멤버 함수 정의:
void B::foo() { std::cout << "B::foo();\n"; }
B::~B() { std::cout << "B::~B();\n"; }
void B::override() { std::cout << "B::override();\n"; }
int main()
{
    B b;
    b.foo();
    b.override(); // OK, `override()` 멤버 함수 호출
    int override{42}; // OK, 정수 변수 정의
    std::cout << "override: " << override << '\n';
}

출력:

B::foo();
B::override();
override: 42
B::~B();
A::~A();

참고 항목

final 지정자 (C++11) 메서드가 재정의되거나 클래스가 파생되는 것을 금지함을 선언