[디딤돌 C++] 43. 상속과 다형성 최종 실습 – 파생 클래스

이제 파생 형식인 학사 학생, 운동학생, 마법학생과 진입점 main 부분을 구현합시다.

먼저 학사 학생 클래스에 필요한 멤버들을 고민해 보기로 해요.

class SStudent :
    public Student
{
학사 학생은 더미 뇌가 멤버 필드로 필요합니다. 
    int dummy;
그리고 더미 뇌는 공부한 횟수가 5이 배수일 때마다 1씩 증가해야 하므로 공부한 횟수도 기억해야죠.
    int total_scnt;
public:
    SStudent(string name);  
“공부하다.”, “강의받다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.” 메서드를 재정의해야겠죠.
    virtual void Study();
    virtual void ListenLecture();
    virtual void Sleep();
    virtual void Relax();
    virtual void Drink();
    virtual void Sing();
그리고 정보 출력 메서드도 재정의합시다.
    virtual void View()const;
학사 학생은 “독서하다.” 기능이 추가로 있습니다.
    void Reading();
};
학사 학생 클래스 다이어그램

생성자에서는 더미 뇌를 0으로 초기화하고 공부한 횟수를 0으로 초기화하세요.

SStudent::SStudent(string name):Student(name)
{
    dummy = 0;//더미 뇌는 생성 시 0
    total_scnt = 0;
}

“공부하다.” 에서는 시나리오에 나와있는 것처럼 멤버 필드 값을 변경합니다.

void SStudent::Study()
{
    SetHP(GetHP()-5);//체력 5소모
    SetIQ(GetIQ()+GetSCnt()+dummy);//지력: scnt+더미 뇌 증가
    SetStress(GetStress()-2);//스트레스: 2감소
    SetSCnt(GetSCnt()+1);
    total_scnt++;
    if(total_scnt%5 == 0)//더미 뇌는 공부한 회수가 5의 배수가 될 때마다 1씩 증가
    {
        dummy++;
    }
}

“강의받다.”, “잠자다.”, “휴식하다.”, “음료마시다.”, “노래하다.” 메서드도 같은 방법으로 구현하세요.

정보 보기 기능에서는 학사 학생임을 출력하고 기반 형식에 무효화한 View 메서드를 호출하여 공통적인 부분을 출력합니다. 그리고 학사 학생에 있는 더미 뇌와 연속으로 공부한 횟수를 출력하세요.

void SStudent::View()const
{
    cout<<"학사 학생";
    Student::View();
    cout<<" 더미 뇌:"<<dummy<<"연속으로 공부한 횟수:"<<total_scnt<<endl;
}

“독서하다.” 기능도 시나리오를 보고 멤버 필드 값을 변경하세요.

void SStudent::Reading()
{
    dummy++;//더미 뇌 1증가
    SetStress(GetStress()-5);//스트레스: 5감소
}

마법 학생과 운동학생도 같은 방법으로 구현하세요.

학생 클래스 다이어그램

이제 진입점 main 함수를 구현해 보기로 해요.

먼저 학사 학생, 운동 학생, 마법 학생을 한 명씩 생성하세요.

Student *stues[3];
stues[0] = new SStudent("공부 좋아");
stues[1] = new PStudent("운동 잘해");
stues[2] = new MStudent("빠쥬따꾸");

cout<<"강의"<<endl;
for(int i = 0; i<3; i++)
{
전체 학생이 강의를 받게하고 정보를 출력하세요.
    stues[i]->ListenLecture();
    cout<<stues[i]<<endl;
}

cout<<"자습"<<endl;
for(int i = 0; i<3; i++)
{
자습에서는 전체 학생을 공부하게 합니다.
    stues[i]->ListenLecture();
만약 학사 학생일 때는 독서도 하므로 dynamic_cast로 형 변환하여 확인하는 부분이 필요하겠죠.
    SStudent *ss = dynamic_cast<SStudent *>(stues[i]);
    if(ss)
    {
        ss->Reading();
    }
    cout<<stues[i]<<endl;
}

다른 기능들도 같은 방법으로 구현하세요.