C & C++/C++

[C++] 멤버 함수 overriding, virtual

  • -
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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.