다형성 실습 – 오케스트라, 음악가, 피아니스트, 드러머 [C++]

안녕하세요. 언제나 휴일에 언휴예요.

이번에는 다형성 실습이예요.

다형성은 하나의 이름으로 보여도 실제 형태는 다양할 수 있는 성질입니다.

기반 형식 포인터 변수로 파생 형식 개체를 사용할 수 있는 특징을 형식의 다형성이라고 부릅니다.

기반 형식의 가상 메서드를 파생 형식에서 재정의할 수 있습니다.

이 때 기반 형식 포인터 변수로 해당 메서드를 호출하면 실제 개체 형식에 정의한 메서드가 동작합니다.

이러한 특징을 메서드의 다형성이라고 부릅니다.

이러한 다형성에 관한 실습을 오케스트라(음악가, 피아니스트, 드러머) 소재로 진행합니다.

/* 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 두두둥