프로그래밍/C,C++

virtual, override, final 관련 정리

MAKGA 2021. 11. 3. 22:07
320x100

virtual 키워드는 상속 받는 자식 클래스에서 override해서 구현하라는 의미로 부모클래스에서 사용된다.

보통의 가상 함수는 override를 강제하지 않고 옵션으로 두지만, 순수 가상 함수로 선언해 자식 클래스에서 무조건 구현해야 하도록 만들 수 있다.

 

override 키워드는 부모의 가상함수를 재정의 했다는 의미로 사용된다.

재정의 하는 경우는 다음과 같은 성질을 만족해야 한다.

  • 부모 클래스 함수가 반드시 가상 함수 이어야한다.
  • 부모의 함수와 자식의 함수 이름이 반드시 동일해야한다. (소멸자 예외)
  • 부모의 함수와 자식의 함수 매개변수 형식들이 반드시 동일해야한다.
  • 부모의 함수와 자식의 함수 const 성이 반드시 동일해야한다.
  • 부모의 함수와 자식의 함수 반환형식과 예외 명세가 호환되어야한다.
  • 멤버 함수들의 참조 한정자(reference qualifier)가 동일해야한다. (C++11 추가)
class Parent
{
public:
    virtual func_a() {} // 가상함수
    virtual func_b() = 0; // 순수 가상함수
};

class Child : public Parent
{
public:
//    virtual func_a() override { } // OK
//    virtual func_b() override { } // ERROR
}

 

final 키워드는 더 이상의 상속 또는 재정의를 방지할 때 사용한다.

class A
{
    virtual void func_a() = 0;
};

class B final : class A
{
};

class C : public B // ERROR
{
}

class D : public A
{
    void func_a() override final;
}

class E : D
{
    void func_a(); // ERROR
}
320x100