인터페이스 코드

#include <iostream>
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */
#include <string>

using namespace std;

// 지하철 이용할 모든 클래스 클래스 타입들은 지하철 인터페이스를 구현 해야 함.
class 지하철인터페이스{
public:
// 순수 가상 메소드(함수) : 현재 클래스를 상속한 모든 클래스는
// 반드시 기필코 무조건 현재 메소드를 오버라이드 해야 한다.
void virtual 이동하다() = 0;

};

//던전 이용할 모든 클래스 타입들은 던전 인터페이스를 구현 해야 함
class 던전인터페이스{
public:
void virtual 사냥하다() = 0;
};


// 나는 인간이고 지하철을 이용할 수 있고, 던전에서 사냥도 할 수 있다.
class 인간 : public 지하철인터페이스, public 던전인터페이스{

public:
void virtual 이동하다(){
cout << "이동하다" << endl;
}
void virtual 공격하다(){
cout << "공격하다" << endl;
}
void virtual 대화하다(){
cout << "대화하다" << endl;
}
void virtual 음식을먹다(){
cout << "음식을먹다" << endl;
}
};

class 기사 : public 인간
{
public:
void 이동하다(){
cout << "우렁찬 고함을 지르면서 ";
인간::이동하다();
}
void 사냥하다(){
cout << " 공격을 한다" << endl;
}
};


class 마법사 : public 인간{
public :
void 이동하다(){
cout << "공중 부양을 하면서";
인간::이동하다();
}
void 사냥하다(){
cout << " 공격을 한다" << endl;
}
};

class 마을시민 : public 인간{
public :
void 사냥하다(){
cout << " 공격을 한다" << endl;
}

};


//나는 장식펫이고 지하철을 이용할 수 있다.
class 장식펫 : public 지하철인터페이스{
public:
void virtual 이동하다(){
cout << " 주인을 따라 이동하다" << endl;
}
};


class 강아지펫 : public 장식펫
{
public:
void 이동하다(){
}
};


class 용펫 : public 장식펫
{
public:
void 이동하다(){
cout << "날개짓을 하면서";
장식펫::이동하다();
}
};

class 로봇펫 : public 장식펫
{
public:
void 이동하다(){
cout << "삐리리삐리리리리";
장식펫::이동하다();
}
};


// 나는 몬스터고 던전에서 사냥을 할 수 있다.
class 소환수 : public 던전인터페이스
{
public:
void 사냥하다(){
cout << "소환 몬스터가  공격을 한다" << endl;
}

};




class 스톰윈드지하철 {
public:
/*
void 지하철에탑승하다(기사* 기사){
기사->이동하다();
}

void 지하철에탑승하다(마법사* 법사){
법사->이동하다();
}

void 지하철에탑승하다(마을시민* 시민){
시민->이동하다();
}
*/
/*
// 인간은 지하철을 탑승 할 수 있다.
void 탑승하다(인간* 인간){
인간->이동하다();
}
*/

//지하철을 이용할 수 있는 탑승자가 지하철에 탑승하다
void 탑승하다(지하철인터페이스* 탑승자){
탑승자->이동하다();
}
};


class 카라잔{
public:
// 던전에서 사냥할 수 있는
void 사냥하다(던전인터페이스* 전투자){
전투자->사냥하다();
}
};

class 스톰윈드마을여관{
public:
void 식사하다(인간* 손님){
손님->음식을먹다();
손님->대화하다();
}
};




void main()
{
기사* 아더 = new 기사();
마법사* 해리포터 = new 마법사();
마을시민* 트루먼 = new 마을시민();




강아지펫* 해피 = new 강아지펫();
용펫* 말리고스 = new 용펫();
로봇펫* 채피 = new 로봇펫();


스톰윈드지하철* 지하철 = new 스톰윈드지하철();

지하철->탑승하다(아더);
지하철->탑승하다(해리포터);
지하철->탑승하다(트루먼);

// 해피가 지하철에 탑승 하려면 인간을 상속 해야 한다.
// 그런데 말입니다.... 해피가 인간인가?
지하철->탑승하다(해피); // 인간타입이 아니므로 오류발생

카라잔* 던전 = new 카라잔();
던전->사냥하다(아더);
던전->사냥하다(해리포터);
던전->사냥하다(트루먼);


소환수* 기생수 = new 소환수();
기생수->사냥하다();



// 장식용으로 구입한 해피가 던전에서 나랑 사냥을 하고 있네?
// 개발자 버그다~~ 야호~~
//던전->사냥하다(해피); // 팻은 던전에서 사냥 할 수 없음

}

댓글

이 블로그의 인기 게시물

날짜 시간 시간차 시간 계산 하기

코루틴에서 CallBack 함수 적용하기

C++ 언어 퍼센트 구하는 방법 / 기본 언어 퍼센트 구하는 방법