안녕하세요. 언제나 휴일에 언휴예요.
이번에는 다형성 실습이예요.
다형성은 하나의 이름으로 보여도 실제 형태는 다양할 수 있는 성질입니다.
기반 형식 포인터 변수로 파생 형식 개체를 사용할 수 있는 특징을 형식의 다형성이라고 부릅니다.
기반 형식의 가상 메서드를 파생 형식에서 재정의할 수 있습니다.
이 때 기반 형식 포인터 변수로 해당 메서드를 호출하면 실제 개체 형식에 정의한 메서드가 동작합니다.
이러한 특징을 메서드의 다형성이라고 부릅니다.
이러한 다형성에 관한 실습을 오케스트라(음악가, 피아니스트, 드러머) 소재로 진행합니다.
/* 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 두두둥