6.1 개체의 다형성
파생을 통해 얻을 수 있는 이점 중의 하나는 기반 클래스 형식의 포인터 변수로 파생된 개체를 관리할 수 있다는 것입니다. 오케스트라를 형성하는 여러 종류의 음악가를 기반 클래스인 음악가에서 파생을 시켜 피아니스트, 드러머 등을 정의함으로써 하나의 컬렉션에서 관리하는 것은 참으로 매력적인 일이 아닐 수 없습니다.
이처럼 기반 클래스 형식의 포인터 변수로 파생된 개체를 관리를 할 수 있기 때문에 특정 변수가 관리하는 개체는 다양한 형태의 개체를 관리할 수 있게 됩니다. 이때 기반 클래스 형식의 포인터 변수로 파생된 개체 인스턴스를 대입할 때 묵시적으로 상향 캐스팅이 됩니다. 그리고, 이러한 특징은 다형성의 일부가 됩니다.
[그림 6.1]
Musician.h |
#pragma once #include <iostream> using std::cout; using std::endl;
class Musician { const int mnum; public: Musician(int _mnum); virtual ~Musician(void); void Greeting()const; };
|
Musician.cpp |
#include "Musician.h"
Musician::Musician(int _mnum):mnum(_mnum) { }
Musician::~Musician(void) { } void Musician::Greeting()const { cout<<mnum<<"번 음악가가 인사합니다."<<endl; } |
Pianist.h |
#pragma once
#include "Musician.h"
class Pianist : public Musician { public: Pianist(int mnum); };
|
Pianist.cpp |
#include "Pianist.h"
Pianist::Pianist(int mnum):Musician(mnum) { } |
Drummer.h |
#pragma once #include "musician.h"
class Drummer : public Musician { public: Drummer(int mnum); };
|
Drummer.cpp |
#include "Drummer.h"
Drummer::Drummer(int mnum):Musician(mnum) { }
|
Orchestra.h |
#pragma once #include "Pianist.h" #include "Drummer.h" class Orchestra { Musician **members; const int max_members; int now_members; public: Orchestra(int _max_members); ~Orchestra(void); bool JoinMember(Musician *musician); void Greeting()const; private: void InitializeOrchestra(); };
|
Orchestra.cpp |
#include "Orchestra.h"
Orchestra::Orchestra(int _max_members):max_members(_max_members) { InitializeOrchestra(); } Orchestra::~Orchestra(void) { } void Orchestra::InitializeOrchestra() { members = new Musician*[max_members]; now_members = 0; } bool Orchestra::JoinMember(Musician *musician) { if(now_members<max_members) { members[now_members] = musician; now_members++;
return true; } return false; } void Orchestra::Greeting()const { cout<<"최대 단원수:"<<max_members<<" 현재 단원수:"<<now_members<<endl; for(int i = 0; i<now_members; i++) { members[i]->Greeting(); } } |
Orchestra의 멤버들을 기반 클래스 형식의 포인터로 관리하도록 캡슐화 하였습니다.
Example.cpp |
#include "Orchestra.h"
void main() { Orchestra *orche = new Orchestra(50); Pianist *pianist = new Pianist(1); Drummer *drummer = new Drummer(2);
orche->JoinMember(pianist); orche->JoinMember(drummer);
orche->Greeting();
delete pianist; delete drummer; delete orche;
} |
사용한 예를 보시면 실제 생성한 개체는 파생 클래스 형식의 Pianist와 Drummer를 생성하고 입력 매개 변수가 기반 클래스 Musician 포인터인 JoinMember 메서드를 호출하고 있습니다. 이 같은 경우에 C++에서는 상향 캐스팅을 통해 기반 클래스 형식 포인터 변수로 파생된 개체를 관리할 수 있습니다.
[그림 6.2]
(모든 동영상 강의는 무료입니다.)
'언어 자료구조 알고리즘 > Escort C++' 카테고리의 다른 글
[C++] 클래스에 연산자 중복 정의 (0) | 2016.04.15 |
---|---|
[C++] 전역 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 연산자 중복 정의 (0) | 2016.04.15 |
[C++] 하향 캐스팅 (0) | 2016.04.15 |
[C++] 메서드의 다형성 (0) | 2016.04.15 |
[C++] 파생 시에 액세스 지정 (0) | 2016.04.15 |
[C++] 무효화 된 멤버 사용하기 (0) | 2016.04.15 |
[C++] 무효화 (0) | 2016.04.15 |
[C++] 파생 개체 생성 과정 및 초기화 (0) | 2016.04.15 |
[C++] 일반화 관계와 파생 (0) | 2016.04.15 |