C++/C++ 예제

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

언제나휴일 2020. 7. 21. 16:38
반응형

 

다형성 실습 클래스 다이어그램

/* https://ehpub.co.kr
   C++ 예제 - 언제나 휴일
   다형성 실습
*/
#include <iostream>
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 두두둥
반응형