[C++] 함수 오버라이딩(override)

728x90
반응형

C++에서 함수 오버라이딩(Function Overriding)은 상속(Inheritance)에서 발생하는 개념으로, 부모 클래스(Base Class)에서 정의된 함수를 자식 클래스(Derived Class)에서 재정의하는 것을 의미합니다. 이로 인해 자식 클래스에서 부모 클래스의 함수를 재사용하거나 확장할 수 있습니다. 함수 오버라이딩은 다형성(Polymorphism)의 핵심 요소 중 하나로, 런타임 시점에 적절한 함수가 호출되도록 합니다.

함수 오버라이딩의 조건

  1. 함수 시그니처(Function Signature): 오버라이딩하는 함수는 부모 클래스의 함수와 동일한 함수 이름, 매개변수 리스트, 반환 타입을 가져야 합니다.
  2. 접근 제어자(Access Specifier): 부모 클래스의 함수가 public이나 protected로 선언되어 있어야 자식 클래스에서 오버라이딩할 수 있습니다.
  3. virtual 키워드: 부모 클래스의 함수는 virtual 키워드로 선언되어야 합니다. 이 키워드는 해당 함수가 자식 클래스에서 오버라이딩될 수 있음을 나타냅니다.
  4. 부모클래스와 동일한 이름의 함수를 자식 클랙스에서 정의한다고해서 무조건 함수 오버리이딩이 되는것은 아니다. 매개변수의 자료형 및 개수가 다르면 이는 함수 오버로딩되어 전달되는 인자에 따라서 호출되는 함수가 결정된다. 즉, 함수 오버로딩은 상속관계에서도 구성이 될 수 있다.

예제 코드

#include <iostream>
using namespace std;

class Base {
public:
    virtual void show() {  // 부모 클래스의 함수는 virtual로 선언
        cout << "Base class show() function" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {  // 자식 클래스에서 오버라이딩
        cout << "Derived class show() function" << endl;
        Base::show(); // 오버라이드된 부모클래스의 함수를 호출하는 경우 
    }
};

int main() {
    Base *b;
    Derived d;
    b = &d;

    // 포인터를 통해 자식 클래스의 show()가 호출됨
    b->show();  // 출력: Derived class show() function

    return 0;
}

override 키워드

C++11부터는 자식 클래스의 오버라이딩 함수에 override 키워드를 명시적으로 추가할 수 있습니다. 이는 해당 함수가 부모 클래스의 함수를 정확히 오버라이딩하고 있음을 컴파일러에게 명확히 알리며, 만약 부모 클래스에 동일한 시그니처의 함수가 없다면 컴파일 오류가 발생하게 됩니다.
const 키워드와 함께 사용해야 하는 경우는 const를 먼저 작성하고 override를 작성해야 한다.

함수 오버로딩과의 차이점

  • 함수 오버로딩(Function Overloading)은 같은 클래스 내에서 같은 이름의 함수를 매개변수의 타입이나 개수에 따라 여러 번 정의하는 것.
  • 함수 오버라이딩(Function Overriding)은 상속 관계에서 자식 클래스가 부모 클래스의 함수를 재정의하는 것.

요약

함수 오버라이딩은 부모 클래스에서 정의된 함수를 자식 클래스에서 동일한 시그니처로 재정의하는 기능으로, 다형성을 구현하는 중요한 요소입니다. 이 기능을 통해 자식 클래스는 부모 클래스의 함수 동작을 대체하거나 확장할 수 있습니다.

728x90
반응형