C++

[C++] Override와 final 키워드

hanseongbugi 2024. 12. 13. 16:33

상속을 간단하게 표현하면?

  • 상속이란 A라는 클래스의 멤버를 B라는 클래스에서도 사용할 수 있도록 하는 것
  • 또한, B라는 클래스가 A라는 클래스의 기능을 확장할 수 있게 하는 것

virtual 키워드란?

  • override와 final 키워드는 virtual과 짝꿍으로 사용된다.
  • virtual은 상속 받은 자식 클래스에서 해당 함수를 오버라이딩 해서 사용하라는 것을 알려주는 키워드이다.
  • 또한, 다형성을 구현할 수 있다.
    • virtual 키워드를 사용하게 된다면 업캐스팅을 하였을 때 동적 바인딩을 할 수 있게 된다.
    • 원래 업캐스팅을 하게 된다면 정적 바인딩으로 인해 부모의 함수를 호출함
class Parent {
public:
    void print() {
        std::cout << "이곳은 Parent 입니다." << std::endl;
    }
};

class Child : public Parent {
public:
    void print() {
        cout << "이곳은 Child 입니다." << endl;
    }
};

void main() {
    Parent* p = new Parent;
    Child* c = new Child;
    
    p->print();
    p = c;
    p->print(); //<--- Static binding
}
output
이곳은 Parent 입니다.
이곳은 Parent 입니다.
class Parent {
public:
    virtual void print() {
        std::cout << "이곳은 Parent 입니다." << std::endl;
    }
};

class Child : public Parent {
public:
    virtual void print() {
        cout << "이곳은 Child 입니다." << endl;
    }
};

void main() {
    Parent* p = new Parent;
    Child* c = new Child;
    
    p->print();
    p = c;
    p->print(); //<--- Dynamic binding
}
output
이곳은 Parent 입니다.
이곳은 Child 입니다.
  • virtual 키워드를 사용해서 함수 오버라이딩을 강제할 수 있다.
    • 순수 가상 함수를 만들면 된다.

override란?

  • 오버라이드 키워드를 사용해 오버라이딩 함수라는 것을 명시할 수 있음
  • interface가 변경되었을 때 Derived 클래스에 컴파일 에러를 발생시킬 수 있음
class Parent {
    virtual void func(int x);
};
class Child : public Parent {
    virtual void func(); //<--- 컴파일은 잘 되지만 동작은 이상해짐
};
  • 사실 오버라이드 키워드를 사용하지 않고 순수 가상함수를 사용해도 위 문제는 해결 할 수 있다.
  • 하지만, 부모에 순수 가상함수나 가상함수가 사라진다면 감지를 하지 못한다.
class Parent {
    virtual void func(int x);
};
class Child : public Parent {
    void func() override; //<--- override한다고 컴파일러에게 알리는 것
};
  • override키워드를 사용하면 오버라이드할 함수에 virtual를 굳이 붙일 필요가 없어진다.
    • virtual이나 override를 붙이지 않아도 Derived의 func는 오버라이딩된 함수이다.
    • 하지만 컴파일 에러를 잡아내기 위해 override를 붙인다.
    • 굳이 붙일 필요가 없어지는 이유는 중복된 표현이기 때문이다.

final이란?

  • 상속을 방지하거나 가상함수를 더이상 오버라이딩 하지 않게 해준다.
  • 부모 클래스의 멤버를 자식이 재정의 하지 못하도록 막을 때 사용
  • 부모 클래스를 자식이 상속 받을 때 클래스 자체를 더이상 상속이 불가능하게 만들 수 있음
    • final이 붙은 함수를 상속 받아서 사용하려 할때 컴파일 에러가 발생
class Parent {
    virtual void func(int x);
};
class Child : public Parent {
    void func() final; //<--- 마지막 override를 의미
};

 

 

 

 

 

출처

https://coding-factory.tistory.com/699

 

[C++] 가상함수(virtual) 사용법 총정리

가상함수란? 가상함수는 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수입니다. virtual이라는 예약어를 함수 앞에 붙여서 생성할 수 있으며 이렇게 생성된 가

coding-factory.tistory.com

https://blockdmask.tistory.com/415

 

[C++] override, final 키워드 (가상함수 관련 키워드)에 대해서

안녕하세요. BlockDMask 입니다. 오늘은 가상함수 virtual, 상속 주제와 관련해서 사용할 수 있는 override, final 키워드를 가지고 왔습니다. override, final 둘 다 C++11 이후 부터 사용이 가능한 키워드 이며

blockdmask.tistory.com