C & C++/C++ 예제 및 소스
다형성 실습 – 오케스트라, 음악가, 피아니스트, 드러머 [C++]
언휴
2025. 1. 8. 14:00
안녕하세요. 언제나 휴일에 언휴예요.
이번에는 다형성 실습이예요.
다형성은 하나의 이름으로 보여도 실제 형태는 다양할 수 있는 성질입니다.
기반 형식 포인터 변수로 파생 형식 개체를 사용할 수 있는 특징을 형식의 다형성이라고 부릅니다.
기반 형식의 가상 메서드를 파생 형식에서 재정의할 수 있습니다.
이 때 기반 형식 포인터 변수로 해당 메서드를 호출하면 실제 개체 형식에 정의한 메서드가 동작합니다.
이러한 특징을 메서드의 다형성이라고 부릅니다.
이러한 다형성에 관한 실습을 오케스트라(음악가, 피아니스트, 드러머) 소재로 진행합니다.
/* https://ehpub.co.kr
C++ 예제 - 언제나 휴일
다형성 실습
*/
#include
using namespace std;
class Musician
{
const int mnum;
public:
Musician(int mnum) :mnum(mnum)
{
}
void Greeting()
{
cout << mnum << " 인사합니다." << endl;
}
virtual void Play() = 0;//추상 메서드(순수 가상 메서드)
int GetMNum()const
{
return mnum;
}
};
class Pianist :
public Musician
{
public:
Pianist(int mnum) :Musician(mnum)
{
}
virtual void Play()
{
cout << GetMNum() << " 딩동 댕동~" << endl;
}
};
class Drummer :
public Musician
{
public:
Drummer(int mnum) :Musician(mnum)
{
}
virtual void Play()
{
cout << GetMNum() << " 두두둥" << endl;
}
};
class Orchestra
{
Musician** members;
const int max_member;
int now_members;
public:
Orchestra(int max_member) :max_member(max_member)
{
Initialize();
}
~Orchestra()
{
delete[] members;
}
bool JoinMember(Musician* mu)
{
if (now_members == max_member)
{
return false;
}
members[now_members] = mu;
now_members++;
return true;
}
void Greeting()const
{
cout << "저희 단원을 소개합니다. 멤버는 총 " << now_members << "명 입니다." << endl;
for (int i = 0; i < now_members; i++)
{
members[i]->Greeting();
}
}
void StartConcert()
{
for (int i = 0; i < now_members; i++)
{
members[i]->Play();//메서드의 다형성
}
}
private:
void Initialize()
{
members = new Musician * [max_member];
now_members = 0;
}
};
int main()
{
Orchestra* orchestra = new Orchestra(50);
Pianist* pianist = new Pianist(1);
Drummer* drummer = new Drummer(2);
orchestra->JoinMember(pianist);//형식의 다형성
orchestra->JoinMember(drummer);//형식의 다형성
orchestra->Greeting();
orchestra->StartConcert();
delete orchestra;
delete drummer;
delete pianist;
return 0;
}
다음은 실행 결과입니다.
저희 단원을 소개합니다. 멤버는 총 2명 입니다.
1 인사합니다.
2 인사합니다.
1 딩동 댕동~
2 두두둥
언제나휴일 여행 및 산책