언어 자료구조 알고리즘/Escort C++

[C++] 개체의 다형성

언제나휴일 2016. 4. 15. 14:21
반응형

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]


6장 

(모든 동영상 강의는 무료입니다.)

반응형