본문 바로가기

TIL

C++ override 키워드

반응형

Class Method의 override keyword는 해당 메소드가 오버라이딩될 메소드라는 걸 컴파일러에게 알려주는 것이다.

C++ 11부터 추가된 키워드인데 이것이 어떻게 도움이 될까? 부모 클래스에 void show(unsigned int x) { return x; }라는 메소드가 있고 자식 클래스에서 이를 오버라이딩하려고 한다.

그러면 void show(unsigned int x) { ... } 로 써야할텐데 프로그래머의 실수로 void show(long long int x) { ... }로 썼다면 컴파일러는 자식 클래스의 별개 메소드로 간주하게 될 것이다.

이 상황에서 void show(long long int x) override { ... }로 코드를 작성한다면 컴파일러는 오버라이딩 되야할 메소드가 제대로 오버라이딩이 안됐다면 컴파일 에러로 프로그래머에게 알려줄 것이다.

아래와 같이 코드를 짰다고 하자.

#include<iostream>

class BaseClass {
public:
    virtual void show(unsigned int x) {
        std::cout << x << '\n';
    }
};

class ChildClass : public BaseClass {
public:
    void show(long long int x) {
        std::cout << "OverFlow!" << '\n';
    }
};

int main() {
    ChildClass *cc = new ChildClass;
    cc->show(1ll << 60);
    BaseClass *bc = cc;
    bc->show(1ll << 60);
    return 0;
}

show 메소드가 제대로 오버라이딩이 되었다면 cc->show()bc->show()Overflow! 가 출력이 되어야 한다.

그러나 위를 실행하면 bc->show()는 0을 출력한다. 즉, override가 제대로 안되서 BaseClass의 show가 호출된 것이다. 프로그래머의 의도와 다르게 진행이 된 것이다.

이제 ChildClass의 show 메소드 옆에다 override 키워드를 붙여주면 컴파일러가 에러를 뱉어주게 된다.

이런 식의 키워드가 좋은 점은 역시 실수를 줄이는 혹은 방지하는 방어적인 코딩이라는 점이다. 코드 짜면서 제일 골치 아픈 것은 역시 런타임 상에서 발생한 버그가 아니겠는가 이를 사전에 방지하는 것은 좋다는 것이다.

반응형