상속과 다형성 최종 실습한 코드예요.
//StuConst.h
#pragma once
class StuConst
{
public:
static const int def_iq;
static const int max_iq;
static const int min_iq;
static const int def_hp;
static const int max_hp;
static const int min_hp;
static const int def_stress;
static const int max_stress;
static const int min_stress;
static const int def_scnt;
static const int max_scnt;
static const int min_scnt;
private://개체를 생성할 수 없게 함
StuConst(void);
};
//StuConst.cpp
#include "StuConst.h"
const int StuConst::def_iq = 100;
const int StuConst::max_iq=200;
const int StuConst::min_iq=0;
const int StuConst::def_hp=100;
const int StuConst::max_hp=200;
const int StuConst::min_hp=0;
const int StuConst::def_stress=0;
const int StuConst::max_stress=100;
const int StuConst::min_stress=0;
const int StuConst::def_scnt=0;
const int StuConst::max_scnt=5;
const int StuConst::min_scnt=0;
StuConst::StuConst(void)
{
}
//Student.h
#pragma once
#include "StuConst.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
static int last_pn;
const int pn;
string name;
int iq;
int hp;
int stress;
int scnt;
public:
Student(string name);
virtual void Study()=0;
virtual void ListenLecture()=0;
virtual void Sleep()=0;
virtual void Relax()=0;
virtual void Drink()=0;
virtual void Sing()=0;
virtual void View()const;
int GetPN()const;
string GetName()const;
int GetIQ()const;
int GetHP()const;
int GetStress()const;
int GetSCnt()const;
protected:
void SetIQ(int iq);
void SetHP(int hp);
void SetStress(int stress);
void SetSCnt(int scnt);
};
//Student.cpp
#include "Student.h"
#define SC StuConst //간략하게 사용할 수 있게 매크로 정의
int Student::last_pn;
Student::Student(string name):pn(++last_pn)
{
this->name = name;
SetIQ(SC::def_iq);
SetHP(SC::def_hp);
SetStress(SC::def_stress);
SetSCnt(SC::def_scnt);
}
void Student::View()const
{
cout<<"주민 번호:"<<pn<<" 이름:"<<name<<endl;
cout<<" IQ:"<<iq<<" HP:"<<hp<<" Stress:"<<stress<<endl;
cout<<" 연속으로 공부한 횟수:"<<scnt<<endl;
}
int Student::GetPN()const
{
return pn;
}
string Student::GetName()const
{
return name;
}
int Student::GetIQ()const
{
return iq;
}
int Student::GetHP()const
{
return hp;
}
int Student::GetStress()const
{
return stress;
}
int Student::GetSCnt()const
{
return scnt;
}
void Student::SetIQ(int iq)
{
if(iq>SC::max_iq)
{
iq = SC::max_iq;
}
if(iq<SC::min_iq)
{
iq = SC::min_iq;
}
this->iq = iq;
}
void Student::SetHP(int hp)
{
if(hp>SC::max_hp)
{
hp = SC::max_hp;
}
if(hp<SC::min_hp)
{
hp = SC::min_hp;
}
this->hp = hp;
}
void Student::SetStress(int stress)
{
if(stress>SC::max_stress)
{
stress = SC::max_stress;
}
if(stress<SC::min_stress)
{
stress = SC::min_stress;
}
this->stress = stress;
}
void Student::SetSCnt(int scnt)
{
if(scnt>SC::max_scnt)
{
scnt = SC::max_scnt;
}
if(scnt<SC::min_scnt)
{
scnt = SC::min_scnt;
}
this->scnt = scnt;
}
//SStudent.h
#pragma once
#include "student.h"
class SStudent :
public Student
{
int dummy;
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();
};
//SStudent..cpp
#include "SStudent.h"
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++;
}
}
void SStudent::ListenLecture()
{
SetHP(GetHP()-3); //체력 3소모
SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
SetStress(GetStress()+GetSCnt());// 스트레스: scnt증가
SetSCnt(0);
}
void SStudent::Sleep()
{
SetHP(GetHP()+10); //체력 10회복
SetStress(GetStress()-5); //스트레스: 5감소
SetSCnt(0);
}
void SStudent::Relax()
{
SetHP(GetHP()+3); //체력 3회복
SetStress(GetStress()-25); //스트레스: 25감소
SetSCnt(0);
}
void SStudent::Drink()
{
SetHP(GetHP()+5); //체력 5회복
SetIQ(GetIQ()-10);//지력: 10감소
SetStress(GetStress()+2);//스트레스: 2증가
SetSCnt(0);
}
void SStudent::Sing()
{
SetHP(GetHP()-10); //체력 10 소모
SetIQ(GetIQ()-(5-GetSCnt()));//지력: 5-scnt감소
SetStress(GetStress()+(5-GetSCnt()));//스트레스: 5-scnt증가
SetSCnt(0);
}
void SStudent::View()const
{
cout<<"학사 학생";
Student::View();
cout<<" 더미 뇌:"<<dummy<<"연속으로 공부한 횟수:"<<total_scnt<<endl;
}
void SStudent::Reading()
{
dummy++;//더미 뇌 1증가
SetStress(GetStress()-5);//스트레스: 5감소
}
//MStudent.h
#pragma once
#include "student.h"
class MStudent :
public Student
{
int stick;
public:
MStudent(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 Travel();
};
//MStudent.cpp
#include "MStudent.h"
MStudent::MStudent(string name):Student(name)
{
stick=0;//지팡이는 생성 시 0
}
void MStudent::Study()
{
SetHP(GetHP()-3);//체력 3소모
SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
SetStress(GetStress()+3);//스트레스: 3증가
SetSCnt(GetSCnt()+1);
}
void MStudent::ListenLecture()
{
SetHP(GetHP()-2); //체력 2소모
SetIQ(GetIQ()+GetSCnt());//지력: scnt 증가
SetStress(GetStress()+5);// 스트레스: 5증가
SetSCnt(0);
}
void MStudent::Sleep()
{
SetHP(GetHP()+10); //체력 10회복
SetStress(GetStress()-5); //스트레스: 5감소
SetSCnt(0);
}
void MStudent::Relax()
{
SetHP(GetHP()+3); //체력 3회복
SetStress(GetStress()-25); //스트레스: 25감소
SetSCnt(0);
}
void MStudent::Drink()
{
SetHP(GetHP()+5+stick); //체력 5+지팡이 회복
SetIQ(GetIQ()-(10-stick));//지력: 10-지팡이 감소
SetStress(GetStress()-2);//스트레스: 2감소
SetSCnt(0);
}
void MStudent::Sing()
{
SetHP(GetHP()-(10-stick)); //체력 10-지팡이 소모
SetIQ(GetIQ()-5);//지력: 5감소
SetStress(GetStress()-5);//스트레스: 5감소
SetSCnt(0);
}
void MStudent::View()const
{
cout<<"마법 학생";
Student::View();
cout<<" 지팡이:"<<stick<<endl;
}
void MStudent::Travel()
{
stick++;//지팡이 1증가
}
//PStudent.h
#pragma once
#include "student.h"
class PStudent :
public Student
{
int air;
public:
PStudent(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 Dance();
};
//PStudent..cpp
#include "PStudent.h"
PStudent::PStudent(string name):Student(name)
{
air=0;//air는 생성 시 0
}
void PStudent::Study()
{
SetHP(GetHP()-2);//체력 2소모
SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가
air-=3;
SetStress(GetStress()-air*3);//스트레스: air*3감소
SetSCnt(GetSCnt()+1);
}
void PStudent::ListenLecture()
{
SetHP(GetHP()-1); //체력 1소모
SetIQ(GetIQ()+GetSCnt()/2);//지력: scnt/2 증가
air-=5;
SetStress(GetStress()-air*3);// 스트레스: air*3 감소
SetSCnt(0);
}
void PStudent::Sleep()
{
SetHP(GetHP()+10); //체력 10회복
SetStress(GetStress()-5); //스트레스: 5감소
SetSCnt(0);
}
void PStudent::Relax()
{
SetHP(GetHP()+8); //체력 8회복
SetStress(GetStress()-25); //스트레스: 25감소
SetSCnt(0);
}
void PStudent::Drink()
{
SetHP(GetHP()+5); //체력 5 회복
SetIQ(GetIQ()-3);//지력: 3 감소
SetStress(GetStress()-2);//스트레스: 2감소
SetSCnt(0);
}
void PStudent::Sing()
{
SetHP(GetHP()-5); //체력 5 소모
SetIQ(GetIQ()+2);//지력: 5증가
SetStress(GetStress()-5);//스트레스: 5감소
SetSCnt(0);
}
void PStudent::View()const
{
cout<<"운동 학생";
Student::View();
cout<<" air:"<<air<<endl;
}
void PStudent::Dance()
{
SetHP(GetHP()-5); //체력 5 소모
SetIQ(GetIQ()+3);//지력: 3증가
air++;//air 1증가
}
//Program.cpp
#include "SStudent.h"
#include "MStudent.h"
#include "PStudent.h"
int 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();
stues[i]->View();
}
cout<<"자습"<<endl;
for(int i = 0; i<3; i++)
{
stues[i]->Study();
SStudent *ss = dynamic_cast<SStudent *>(stues[i]);
if(ss)
{
ss->Reading();
}
stues[i]->View();
}
cout<<"소등"<<endl;
for(int i = 0; i<3; i++)
{
stues[i]->Sleep();
stues[i]->View();
}
cout<<"자유 시간"<<endl;
for(int i = 0; i<3; i++)
{
stues[i]->Relax();
MStudent *ms = dynamic_cast<MStudent *>(stues[i]);
if(ms)
{
ms->Travel();
}
stues[i]->View();
}
cout<<"파티"<<endl;
for(int i = 0; i<3; i++)
{
stues[i]->Drink();
stues[i]->View();
}
cout<<"노래방"<<endl;
for(int i = 0; i<3; i++)
{
stues[i]->Sing();
PStudent *ps = dynamic_cast<PStudent *>(stues[i]);
if(ps)
{
ps->Dance();
}
stues[i]->View();
}
for(int i = 0; i<3; i++)
{
delete stues[i];
}
return 0;
}
▷ 실행 결과
강의
학사 학생주민 번호:1 이름:공부 좋아
IQ:100 HP:97 Stress:0
연속으로 공부한 횟수:0
더미 뇌:0연속으로 공부한 횟수:0
운동 학생주민 번호:2 이름:운동 잘해
IQ:100 HP:99 Stress:15
연속으로 공부한 횟수:0
air:-5
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:100 HP:98 Stress:5
연속으로 공부한 횟수:0
지팡이:0
자습
학사 학생주민 번호:1 이름:공부 좋아
IQ:100 HP:92 Stress:0
연속으로 공부한 횟수:1
더미 뇌:1연속으로 공부한 횟수:1
운동 학생주민 번호:2 이름:운동 잘해
IQ:100 HP:97 Stress:39
연속으로 공부한 횟수:1
air:-8
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:100 HP:95 Stress:8
연속으로 공부한 횟수:1
지팡이:0
소등
학사 학생주민 번호:1 이름:공부 좋아
IQ:100 HP:102 Stress:0
연속으로 공부한 횟수:0
더미 뇌:1연속으로 공부한 횟수:1
운동 학생주민 번호:2 이름:운동 잘해
IQ:100 HP:107 Stress:34
연속으로 공부한 횟수:0
air:-8
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:100 HP:105 Stress:3
연속으로 공부한 횟수:0
지팡이:0
자유 시간
학사 학생주민 번호:1 이름:공부 좋아
IQ:100 HP:105 Stress:0
연속으로 공부한 횟수:0
더미 뇌:1연속으로 공부한 횟수:1
운동 학생주민 번호:2 이름:운동 잘해
IQ:100 HP:115 Stress:9
연속으로 공부한 횟수:0
air:-8
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:100 HP:108 Stress:0
연속으로 공부한 횟수:0
지팡이:1
파티
학사 학생주민 번호:1 이름:공부 좋아
IQ:90 HP:110 Stress:2
연속으로 공부한 횟수:0
더미 뇌:1연속으로 공부한 횟수:1
운동 학생주민 번호:2 이름:운동 잘해
IQ:97 HP:120 Stress:7
연속으로 공부한 횟수:0
air:-8
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:91 HP:114 Stress:0
연속으로 공부한 횟수:0
지팡이:1
노래방
학사 학생주민 번호:1 이름:공부 좋아
IQ:85 HP:100 Stress:7
연속으로 공부한 횟수:0
더미 뇌:1연속으로 공부한 횟수:1
운동 학생주민 번호:2 이름:운동 잘해
IQ:102 HP:110 Stress:2
연속으로 공부한 횟수:0
air:-7
마법 학생주민 번호:3 이름:빠쥬따꾸
IQ:86 HP:105 Stress:0
연속으로 공부한 횟수:0
지팡이:1
2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 41. 상속과 다형성 최종 실습 시나리오
2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 42. 상속과 다형성 최종 실습 - 학생
2016/04/25 - [언어 자료구조 알고리즘/디딤돌 C++] - [C++] 43. 상속과 다형성 최종 실습 - 파생 클래스
'언어 자료구조 알고리즘 > 디딤돌 C++' 카테고리의 다른 글
[C++] 49. 대입 연산자 중복 정의 (0) | 2016.04.25 |
---|---|
[C++] 48. 증감 연산자 중복 정의 (0) | 2016.04.25 |
[C++] 47. 클래스에 연산자 중복 정의 (0) | 2016.04.25 |
[C++] 46. 전역 연산자 중복 정의 (0) | 2016.04.25 |
[C++] 45. 연산자 중복 정의 개요 (0) | 2016.04.25 |
[C++] 43. 상속과 다형성 최종 실습 - 파생 클래스 (0) | 2016.04.25 |
[C++] 42. 상속과 다형성 최종 실습 - 학생 (0) | 2016.04.25 |
[C++] 41. 상속과 다형성 최종 실습 시나리오 (0) | 2016.04.25 |
[C++] 40. 상속과 다형성 실습2 (도형) (0) | 2016.04.25 |
[C++] 39. 상속, 다형성 실습1 (상품, 할인 상품) (0) | 2016.04.25 |