오버로딩과 오버라이딩

songtofu·2022년 3월 26일
0

오버로딩(Overloading) : 함수 중복 정의

  1. 함수 오버로딩 : 같은 이름의 함수에 매개변수를 다르게 사용하여 매개 변수에 따라 다른 함수가 실행되는 것.
  2. 연산자 오버로딩 : 기본 연산자들을 직접 사용자가 정의하는 것.
  • 메소드 이름이 같아야 한다:
  • 리턴형이 같아도 되고 달라도 된다:
  • 파라미터 개수가 달라야한다.
  • 파라미터 개수가 같을 경우, 자료형이 달라야한다.

오버라이딩(Overriding) : 함수 재정의

  • 상속받았을 떄 부모클래스의 함수를 사용하지 않고 다른 기능을 실행할 떄 함수를 자식클래스에 같은 이름, 매개변수로 재정의 해서 사용하는 것.

1.파생 클래스에서 직접 오버라이딩하는 방법

  • ex)
void Person::ShowPersonInfo()
{
    cout << name_ << "의 나이는 " << age_ << "살입니다." << endl;
}
...
void Student::ShowPersonInfo()
{
    cout << "이 학생의 학번은 " << student_id_ << "입니다." << endl;
}

==> 실행 결과
순신의 나이는 35살입니다.
이 학생의 학번은 123456789입니다.

1)Person 클래스의 ShowPersonInfo() 멤버 함수를 Student 클래스에서 상속받아 재정의
2) Student 객체에서 ShowPersoninfo() 멤버 함수를 호출
3) 기초 클래스인 Person 클래스의 멤버 함수가 아닌 재정의한 멤버 함수가 호출됨을 알 수 있다.

  • 또한, 범위 지정 연산자(::)를 사용하면 파생 클래스에서 기초 클래스의 원래 멤버 함수를 호출할 수도 있다.
    ex)
Student hong(123456789, "길동", 29);
hong.ShowPersonInfo();
hong.Person::ShowPersonInfo();

==>실행 결과
이 학생의 학번은 123456789입니다.
길동의 나이는 29살입니다.
  • 파생 클래스에서 오버라이딩의 문제점
    포인터 변수를 사용할 때, 예상치 못한 결과를 반환할 수도 있다.
    ex)
Person* ptr_person;
Person lee("순신", 35);
Student hong(123456789, "길동", 29);

ptr_person = &lee;
ptr_person->ShowPersonInfo();
ptr_person = &hong;
ptr_person->ShowPersonInfo();

==>실행 결과
순신의 나이는 35살입니다.
길동의 나이는 29살입니다.

1) Person 객체를 가리킬 수 있는 포인터 변수 ptr_person을 생성하여, Person 객체의 주소값을 대입
2) 포인터 변수에 멤버 접근 연산자(->)를 사용해 Person 객체의 ShowPersonInfo()함수를 호출.
3) Student 객체의 주소값을 대입하고, 이번에는 Student객체의 ShowPersonInfo()함수를 호출.
4) 두 번 모두 Person 객체의 ShowPersonInfo() 함수가 호출된다.

왜냐하면, C++ 컴파일러는 포인터 변수가 실제로 가리키는 객체의 타입을 기준으로 함수를 호출하는 것이 아니라, 해당 포인터의 타입을 기준으로 함수를 호출하기 때문. 따라서 Person 객체를 가리킬 수 잇는 포인터 변수로는 Person 객체의 멤버 함수만을 호출할 수 있다.

==> 이러한 문제점을 해결하기 위해서 virtual 키워드를 사용한 가상 함수를 제공하고 있다.

2. 가상 함수를 이용해 오버라이딩하는 방법

  • ex)
class Student : public Person
{
private:
    int student_id_;
public:
    Student(int sid, const string& name, int age); // 파생 클래스 생성자의 선언
    virtual void ShowPersonInfo(); // 파생 클래스에서 상속받은 멤버 함수의 재정의
};

==>실행 결과
순신의 나이는 35살입니다.
이 학생의 학번은 123456789입니다.

출처

링크텍스트

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글

관련 채용 정보