Overriding & Overloading

Overloading

  • 같은 이름의 메서드를 여러 개 정의
  • 매개변수의 타입이 다르거나, 갯수가 다름
  • 리턴 타입이나 접근 제어자는 영향을 주지 않음
int add(int a, int b);
float add(float a, float b);
int add(int a, int b, int c);
// ...

Overriding

  • 상위 클래스의 메소드를 하위 클래스에서 재정의
// 베이스 클래스
class A
{
  // 오버라이딩할 메서드
  virtual void do_something(int a, int b);
}

// 파생 클래스
class B : A
{
  // 파생 클래스에서 재정의(오버라이딩)된 메서드
  void do_something(int a, int b) override;
}

굳이 override를 쓰는 이유?

  • 부모 클래스에서 virtual keyword를 사용한 function이 있고, 이를 파생 클래스에서 overriding 할 때 명시적으로 이를 표시해주는 역할
  • 필수적이지 않으나 코드 리딩에 도움을 줌
  • 파생 클래스 메서드에서 override를 사용했는데 부모 클래스로부터 override할 함수가 없다면 컴파일 에러를 출력
class Base {

  // 오버라이딩을 허용한 부모 클래스의 메서드
  virtual void what() { std::cout << "기반 클래스의 what()" << std::endl; }
};

class Derived : public Base {

  // 파생 클래스에서는 명시적으로 overriding 했는지 나타내는 키워드 없음
  // 또한 const 한정자로 실제로 부모 클래스의 what과 다른 함수
  void what() const { std::cout << "파생 클래스의 what()" << std::endl; }
};

int main()
{
  Derived c;
  Base* p_c = &c;

  // 부모 클래스의 what() 출력!
  p_c->what();    
}

출처

Categories: ,

Updated: