Override-and-Final

Modern C++에 적응하기
Effective Modern C++ Chapter 3. Override and Final


override, final

함수 overriding을 위해서는 아래 조건을 만족해야 한다.

  • Base 클래스 함수가 virtual로 선언되어야 한다.
  • Base 클래스 함수와 이름이 동일해야 한다.(소멸자는 예외)
  • Base 클래스 함수와 매개변수 형식들이 동일해야 한다.
  • Base 클래스 함수와 const성이 동일해야 한다.
  • Base 클래스 함수의 반환 형식과 예외 명세가 호환되어야 한다.

C++11에서는 추가로 아래 한가지 조건을 더 만족해야 한다.

  • Base 클래스 함수와 참조 한정자[1]가 동일해야 한다.

위 조건들을 만족하지 않으면 기존 함수의 overriding이 아닌 새로운 함수가 하위 클래스에 정의된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
public:
virtual void mf1() const;
virtual void mf2(int x);
virtual void mf3() &;
void mf4() const;
};

class Derived : public Base
{
public:
virtual void mf1();
virtual void mf2(unsigned int x);
virtual void mf3() &&;
void mf4() const;
};

위 코드에서 모든 멤버함수는 overriding되지 않는다. 하지만 컴파일러는 어떠한 오류도 발생시키지 않는다.(컴파일러에 따라 일부 오류를 발생시키기도 한다.)


C++11부터는 함수 선언 끝에 override을 붙여서 “부모 클래스의 함수를 재정의한다” 는 의미를 명시할 수 있다.

1
2
3
4
5
6
7
8
class Derived : public Base
{
public:
virtual void mf1() override;
virtual void mf2(unsigned int x) override;
virtual void mf3() && override;
void mf4() const override;
};

override는 의미 명시뿐만 아니라 컴파일러에게 hint를 제공함으로써 잘못 선언된 overriding 함수에 대한 컴파일 에러를 발생시킨다.


BaseDerived클래스를 올바르게 작성하면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
public:
virtual void mf1() const;
virtual void mf2(int x);
virtual void mf3() &;
virtual void mf4() const;
};

class Derived : public Base
{
public:
virtual void mf1() const override;
virtual void mf2(int x) override;
virtual void mf3() & override;
void mf4() const override; // 하위 클래스에서는 굳이 virtual을 붙이지 않아도 된다.
};

override말고 C++11에 추가된 또다른 하나의 키워드는 final이다.
가상함수에 final을 적용하면 하위클래스에서 해당 함수의 재정의를 막는다.

1
2
3
4
5
6
7
8
9
10
11
class Base
{
public:
virtual void mf() final;
};

class Derived : public Base
{
public:
void mf(); // error.
};

finalclass 자체에도 적용할 수 있는데, 그러면 해당 클래스를 상속하는 것을 막는다.

1
2
3
4
5
6
7
8
9
class Base final
{
...
};

class Derived : public Base // error
{
...
};


References


  1. ref-qualifier ↩︎

Author

Joyus.Gim

Posted on

2022-07-26

Updated on

2022-07-26

Licensed under

Comments