상속과 다형성 최종 실습한 코드예요.
//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