728x90
Overriding
오버로딩은 서로 다른 시그니처를 갖는 여러 함수를 같은 이름으로 정의하는 것이다.
오버라이딩은 이미 정의된 함수를 무시하고 같은 이름의 함수를 새롭게 재정의하는 것이라고 할 수 있다.
멤버함수 오버라이딩
C++에서 파생 클래스는 상속을 받을 때 명시한 접근 제어 권한에 맞는 기초 클래스의 모든 멤버를 상속 받는다. 상속받은 멤버 함수는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수 있다.
오버라이딩이란 멤버 함수의 동작만을 재정의하는 것이므로, 함수의 원형은 기존 멤버 함수의 원형과 같아야 한다.
파생 클래스에서 오버라이딩의 문제점
...
void Person::ShowPersonInfo()
{
cout << name_ << "의 나이는 " << age_ << "살입니다." << endl;
}
...
void Student::ShowPersonInfo()
{
cout << "이 학생의 학번은 " << student_id_ << "입니다." << endl;
}
...
Person* ptr_person;
Person lee("순신", 35);
Student hong(123456789, "길동", 29);
ptr_person = &lee;
ptr_person->ShowPersonInfo();
ptr_person = &hong;
ptr_person->ShowPersonInfo();
http://tcpschool.com/cpp/cpp_inheritance_overriding
부모 클래스를 포인터 형태로 선언하고 자식 클래스를 참조하여 같은 이름의 멤버 함수를 호출할 때 자식 클래스의 멤버함수가 아닌 부모 클래스의 멤버함수가 호출 된다.
이를 해결하기위해 virtual 키워드를 사용한 가상함수를 사용할 수 있다.
class Student : public Person
{
private:
int student_id_;
public:
Student(int sid, const string& name, int age); // 파생 클래스 생성자의 선언
virtual void ShowPersonInfo(); // 파생 클래스에서 상속받은 멤버 함수의 재정의
};
728x90
300x250