DevNote

[C++ 11] final과 override의 차이 본문

C++/Modern

[C++ 11] final과 override의 차이

Ahnda 2020. 7. 17. 17:57

C++에서도 클래스 간의 상속에 관해 명시적으로, 그리고 효율적으로 대처할 수 있는 키워드가 있다.

 

(Java의 Interface, final 이나 C#의 Sealed같은 기능을 제공해주는 키워드 같은게 C++11에서 추가됨)

 

그것이 바로 finaloverride 키워드 두 가지이다.

 

이 두 개의 키워드를 통해 이전의 C++에서보다 더 정교하게 상속을 다룰 수 있게 되었다.

 

Keyword Desc
final  - 상속을 차단할 때 사용, final로 선언된 클래스는 상속이 불가.
override  - 부모 클래스의 멤버 함수를 명시적으로 overrding 하기 위해 사용
 - 상속 구조에서 파생 클래스 내에서 override로 선언된 멤버 함수는 부모 클래스의 멤버 함수를 명시적으로 overriding 한다.

 

두 키워드에 대한 이해를 돕기 위해 아래의 예제를 보도록 합세다.

 

<final 예제>

class Base1 final
{
public:
	Base1();
    virtual ~Base1();
    void Func(String InParam);
};

class Base2
{
public:
	Base2();
    virtual ~Base2();
    void Func(String InParam) final;
}

class Derived : public Base2
{
	Derived();
    virtual void Func(String InParam) override; // Error!!!
};

예제 설명

 

 - Base1 클래스는 final로 선언되었기 때문에 상속이 불가능하다.

 

 - Base2 클래스의 Func 멤버 함수는 final로 선언되었기 때문에 Derived 클래스에서 Func 멤버 함수에 대한 overriding이 불가능하다.

 

 

<override 예제>

class Base
{
public:
	Base();
    virtual ~Base();
    virtual void Func(String InParam);
}

class Derived : public Base
{
	Derived();
    virtual void Func(String InParam) override;
};

예제 설명

 

 

 - Base3 클래스에는 Func라는 멤버 함수가 가상으로 선언되었고,

   Base3을 상속받은 Derived 클래스에서 Func 멤버 함수를 override로 선언해줌으로써 부모 클래스의 멤버 함수를         명시적으로 overriding 한다는 것을 보장한다.

 

 - override의 실용성 : 부모 클래스의 멤버 함수를 overriding 할 때, 흔히 저지를 수 있는 실수가 바로 시그니처를 맞춰주지 않는 것이다. 이 때, override 키워드로 명시해주면 사용자가 저지를 수 있는 실수를 컴파일러가 잡아준다.

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

스마트 포인터  (0) 2020.02.13