본문 바로가기

C++

[C++] override 지정자

override 지정자는 가상함수를 재정의하는 함수를 지정할 수 있다.

 

class BaseClass
{
    virtual void funcA();
    virtual void funcB() const;
    virtual void funcC(int = 0);
    void funcD();
};

class DerivedClass: public BaseClass
{
    virtual void funcA(); // ok, works as intended

    virtual void funcB(); // DerivedClass::funcB() is non-const, so it does not
                          // override BaseClass::funcB() const and it is a new member function

    virtual void funcC(double = 0.0); // DerivedClass::funcC(double) has a different
                                      // parameter type than BaseClass::funcC(int), so
                                      // DerivedClass::funcC(double) is a new member function
};

 

위 코드는 3개의 가상함수를 재정의하고 있다. funcA는 정상적으로 재정의된다. funcB는 BaseClass의 funcB가 const이고

DerivedClass의 funcB가 const가 아니기 때문에 재정의하지 않고 새로운 함수를 만든다. funC도 BaseClass와 다른 매개변수를 가지고 있기 때문에 재정의되지 않고 새로운 함수를 만든다. 하지만 개발자 입장에서는 새로운 함수를 만들었다고 생각하지 못하고 가상함수를 재정의했다고 착각할 가능성이 있다.

 

class BaseClass
{
    virtual void funcA();
    virtual void funcB() const;
    virtual void funcC(int = 0);
    void funcD();
};

class DerivedClass: public BaseClass
{
    virtual void funcA() override; // ok

    virtual void funcB() override; // compiler error: DerivedClass::funcB() does not
                                   // override BaseClass::funcB() const

    virtual void funcC( double = 0.0 ) override; // compiler error:
                                                 // DerivedClass::funcC(double) does not
                                                 // override BaseClass::funcC(int)

    void funcD() override; // compiler error: DerivedClass::funcD() does not
                           // override the non-virtual BaseClass::funcD()
};

 

그래서 위와 같이 override 지정자를 함수 뒤에 붙여주면 가상함수를 재정의할 수 없을 때 새로운 함수를 만드는 대신, 오류를 발생시킨다. 그러면 개발자는 가상함수를 잘못된 방법으로 재정의했다는 것을 인지하게된다.

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

[C++] RAII  (0) 2022.06.17
[C++] weak_ptr  (0) 2022.02.24
[C++] shared_ptr  (0) 2022.02.18
[C++] 스마트 포인터, unique_ptr  (0) 2022.02.18
[C++] 파일 입출력 - fopen_s, fread, fwrite  (0) 2022.01.25