이슈
부모 클래스의 가상함수를 재정의 할때 실수로 인해서 재정의한 함수가 호출이 되지 않을 수 있습니다. 바로 아래에 있는 코드처럼 메소드 이름은 같지만 인자가 틀린 경우입니다.
class A
{
public:
virtual void Execute( int value ) { printf( "A::Execute()" ); }
};
class B : public A
{
public:
virtual void Execute( int left, int right ) { printf( "B::Execute()" ); }
};
B 클래스는 'A::Execute()' 가상함수를 재정의 했으니 적절한 시기에 'B::Execute()'메소드가 실행될 것이라 생각하겠지만 결코 실행되는 일은 없습니다. 인자가 틀렸기 때문에 재정의가 아닌 새로 함수가 추가된걸로 인식됩니다.
해결책
그렇다면 이런 경우를 사전에 예방하려면 어떻게 해야 할까요? override 키워드를 이용하면 됩니다.
class A
{
public:
virtual void Execute( int value ) { printf( "A::Execute()" ); }
};
class B : public A
{
public:
virtual void Execute( int left, int right ) override { printf( "B::Execute()" ); }
};
자식 클래스에 override 키워드를 붙임으로서 이 함수는 부모클래스의 멤버함수를 재정의 한 것이다라고 명시적으로 알려주는 것입니다. 컴파일을 하면 아래와 같은 에러가 발생합니다.
'B::Execute' : method with override specifier 'override' did not override any base class methods
재정의 하려는 함수가 부모 클래스에 존재 하지 않는 다는 내용입니다. 의도하지 않은 결과를 사전에 예방할 수 있습니다.