#include
#include /* srand, rand */
#include /* time */
#include
using namespace std;
// 중복 코드를 가지고 만든 캐릭터 클래스
class Chracter{
// protected = 클래스 내부와 상속된 클래스에서만 접근할 수 있는 접근 지정자.
protected:
string _name;
int _hp;
int _damage;
public:
// 최초 실행시 맴버변수 초기화 = 생성자
Chracter(string name, int damage){
_name = name;
_damage = damage;
_hp = 100;
}
//중복 메소드들
virtual void Move(){
cout << _name << " 님이 이동합니다." << endl;
}
void Hit(int damage){
cout << _name << " 님이 " << damage << " 데미지 를 입었습니다." << endl;
}
void Die(){
cout << _name << " 님이 사망했습니다." << endl;
}
void Attack(){
cout << _name << " 님이" << _damage << "만큼의 공격을 합니다." << endl;
}
};
//플레이어는 캐릭터를 상속함
class Player : public Chracter
{
//내부 접근 지정자
private:
int _level;
int _gravity;
string _talkMessage;
//생성자. 맴버변수 초기 설정
//생성자는 클래스명과 같아야 한다.
public:
Player(string name, int damage, string talkmessage)
//플레이어 생성자를 호출하기 전에 캐릭터의 생성자를 먼저 호출하여 플래에어 생성자에 값을 대입
: Chracter(name, damage)
{
// 생성자 호출시 talkmessage 작성
_talkMessage = talkmessage;
_level = 1;
_gravity = 1;
// 생성자 호출과 동시에 코드 실행
cout << _name << " 님이 접속하였습니다." << endl;
talk();
}
void talk(){
cout << _name << " 메세지 : " << _talkMessage << endl;
}
void Jump(){
cout << _name << " 님이 점프 하였습니다. " << endl;
}
void Move(){
cout << _name << " 훨훨 날아서 이동합니다." << endl;
}
};
// Monster 클래스는 Chracter 클래스를 상속 받는다.
class Monster : public Chracter
{
private:
int _skillType;
public:
//생성자
Monster(string name, int skilltype, int damage) : Chracter(name, damage){
_skillType = skilltype;
cout << _name << " 가 나타났다! " << endl;
}
void Skill(){
cout << _name << " 이 " << _skillType << " 의 스킬타입을 사용했습니다." << endl;
}
};
// 클래스 크리쳐는 캐릭터 클래스를 상속 받음.
class Creature : public Chracter
{
// 내부 접근 지정자
private:
int _time;
public:
Creature(string name, int damage, int time) : Chracter(name, damage){
//맴버 변수 생성자로 값 설정
_time = time;
cout << _name << " 가 소환 되었습니다." << endl;
Timer();
}
void Timer(){
cout << _name << " 님이 " << _time << " 시간 뒤에 소멸 됩니다." << endl;
}
};
void PrintMove(Chracter* chra[]){
for (int i = 0; i < 3; i++)
{
// 일반적으로 오버라이드가 안된다.
// 가상함수 사용하여 자식 객체의 메소드 실행 가능
chra[i]->Move();
}
}
void main(){
Player player = Player("홍길동", 25, "안녕!");
Monster mon = Monster("꼴뚜기", 1, 1);
Creature cre = Creature("오징어", 2, 10);
//일반적으로 객체에 Move() 메소드를 호출하면 오버라이드 가능 하다.
/*
player.Move();
mon.Move();
cre.Move();
*/
// 배열을 통하여 각 상속된 Move() 메소드를 호출하면 부모 클래스의 Move()클래스가 호출 되기 때문에
// vitual 키워드를 통하여 자식 클래스의 Move() 메소드를 오버라이드 한다.
Chracter* chr[3];
chr[0] = &player;
chr[1] = &mon;
chr[2] = &cre;
PrintMove(chr);
}
=====================================================================
#include <iostream>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <string>
using namespace std;
// 중복 코드를 가지고 만든 클래스
// 부모 클래스 생성
class ParentContents{
// 자식 클래스에서 접근 할 수 있는 protected 접근 지정자
protected :
string _name;
string _wheree;
int _age;
int _length;
int _weight;
public:
// 초기 설정 생성자
// 생성자는 크래스명과 같아야 한다.
ParentContents(string name, int age, int weight, string wheree){
_name = name;
_age = age;
_weight = weight;
_wheree = wheree;
}
// 중복 메소드
// 오버라이드
virtual void Introduce(){
cout << "안녕 내 이름은 " << _name << "이야 나이는 " << _age << "이고 몸무계는 " << _weight << " 이지." << endl;
}
virtual void Move(){
cout << "그럼 안녕 나는" << _wheree << " 쪽으로 갈꺼야!" << endl;
}
void MyWeight(){
cout << "내 몸무계는" << _weight << " 입니다." << endl;
}
};
//ParentContents 클래스 상속
class Player1 : public ParentContents{
private:
string _myHome;
public:
Player1(string name, int age, int weight, string wheree, string myhome)
// 생성자 상속
: ParentContents(name, age, weight, wheree)
{
_myHome = myhome;
}
// 오버라이드
void Move(){
cout << "안녕!? 나는" << _wheree << " 쪽에서 왔어!" << endl;
}
void MyHome(){
cout << "우리집은" << _myHome << " 야" << endl; // (전세) ㅠㅠ 벗어나고 말꺼야!
}
};
class Player2 : public ParentContents{
private:
string _myCar;
public:
Player2(string name, int age, int weight, string wheree, string myCar)
: ParentContents(name, age, weight, wheree){
_myCar = myCar;
}
void MyCar(){
cout << "내 자동차는" << _myCar << "야." << endl; // (랜드로버) 언젠간 사고 말꺼야!!
}
};
class Player3 : public ParentContents{
private:
int _jump;
public:
Player3(string name, int age, int weight, string wheree, int jump)
: ParentContents(name, age, weight, wheree){
_jump = jump;
}
// 오버라이드
void Introduce(){
cout << "반가워! 내 이름은 " << _name << " 이고 "
<< _age << " 살 이지 부끄럽지만 몸무계는 " << _weight << " 정도야." << endl;
}
void MyJump(){
cout << "나의 점프력은" << _jump << "정도 일꺼야." << endl;
}
};
void PrintIntroduce(ParentContents* parts[]){
for (int i = 0; i < 3; i++) {
parts[i]->Introduce();
}
}
void PrintMove(ParentContents* parts[]){
for (int i = 0; i < 3; i++) {
parts[i]->Move();
}
}
void main(){
Player1 blake = Player1("blake", 25, 70, "동쪽", "전세");
Player2 tom = Player2("tom", 30, 71, "남쪽", "랜드로버");
Player3 jason = Player3("jason", 32, 75, "북쪽", 120);
ParentContents* part[3];
part[0] = &blake;
part[1] = &tom;
part[2] = &jason;
PrintIntroduce(part);
PrintMove(part);
blake.MyHome();
tom.MyCar();
jason.MyJump();
}
댓글
댓글 쓰기