[카테고리:] <span>디딤돌 C++</span>

이번에는 일반화 관계에 있는 파생 클래스 형식의 개체를 생성과 소멸 과정을 알아보기로 할게요.

파생 클래스 형식의 개체를 생성할 때는 기반 클래스를 생성한 후에 파생 클래스를 생성합니다. 실제 생성한 개체에는 기반 클래스에 정의한 멤버도 만들어지는 것이죠. 그리고 소멸할 때는 생성 과정의 역으로 파생 클래스의 소멸자를 수행한 후에 기반 클래스의 소멸자를 수행합니다.

다음은 이를 확인하기 위해 기반 클래스 음악가와 파생 클래스 피아니스트 클래스에 생성자와 소멸자를 추가하여 어떤 순서로 수행하는지 확인하기 위한 출력문을 작성한 예제 코드입니다.

//파생 개체의 생성과 소멸 과정
#include <iostream>
#include <string>
using namespace std;

class Musician
{
public:
    Musician()
    {
        cout<<"음악가 생성자"<<endl;
    }
    ~Musician()
    {
        cout<<"음악가 소멸자"<<endl;
    }
    void Play()
    {
        cout<<"딩동댕"<<endl;
    }
};

class Pianist:
    public Musician //Musician 클래스를 기반으로 파생한 Pianist 클래스 정의
{
public:
    Pianist()
    {
        cout<<"피아니스트 생성자"<<endl;
    }
    ~Pianist()
    {
        cout<<"피아니스트 소멸자"<<endl;
    }
};


int main()
{
    Pianist *pianist = new Pianist();
    pianist->Play();
    delete pianist;
    return 0;
}

▷ 실행 결과

음악가 생성자

피아니스트 생성자

딩동댕

피아니스트 소멸자

음악가 소멸자

실행 결과를 보면 피아니스트 개체를 생성할 때 기반 클래스인 음악가 생성자를 먼저 수행한 후에 파생 클래스인 피아니스트의 생성자를 수행하는 것을 알 수 있습니다. 또한 소멸 과정에서는 역으로 피아니스트의 소멸자를 수행한 후에 음악가의 소멸자를 수행하는 것을 확인할 수 있어요.

그런데 기반 클래스에 기본 생성자를 정의하지 않고 매개 변수가 있는 생성자만 정의하면 파생 개체는 어떻게 생성할까요?

기반 클래스에 매개 변수 있는 생성자만 정의하면 개체를 생성하기 위해 인자를 전달해야 합니다. 이를 기반으로 파생 클래스를 정의하면 파생 개체를 생성할 때 기반 클래스의 생성자를 호출할 때 인자를 전달하지 않으면 컴파일 오류가 발생하겠죠.

이와 같을 때는 비정적 상수화 멤버 초기화처럼 파생 클래스 생성자에 기반 클래스의 생성자 초기화를 해 주어야 합니다.

Pianist(string name):Musician(name) //기반 클래스 생성자 초기화
{
    cout<<"피아니스트 생성자"<<endl;
}

다음은 기반 클래스 음악가의 생성자에 이름을 입력 인자로 받게 정의한 예제입니다. 파생 클래스인 피아니스트의 생성자 부분을 보면 기반 클래스 생성자 초기화 부분을 확인할 수 있습니다.

//기반 클래스에 기본 생성자가 없을 때
#include <iostream>
#include <string>
using namespace std;

class Musician
{   
    string name;
public:
    Musician(string name)
    {
        this->name = name;
        cout<<"음악가 생성자"<<endl;
    }
    ~Musician()
    {
        cout<<"음악가 소멸자"<<endl;
    }
    void Play()
    {
        cout<<"딩동댕"<<endl;
    }
    void View()
    {
        cout<<"이름:"<<name<<endl;
    }
};

 
class Pianist:
    public Musician //Musician 클래스를 기반으로 파생한 Pianist 클래스 정의
{
public:
    Pianist(string name):Musician(name) //기반 클래스 생성자 초기화
    {
        cout<<"피아니스트 생성자"<<endl;
    }
    ~Pianist()
    {
        cout<<"피아니스트 소멸자"<<endl;
    }
};
 
int main()
{
    Pianist *pianist = new Pianist("홍길동");
    pianist->View();
    pianist->Play();   
    delete pianist;
    return 0;
}

▷ 실행 결과

음악가 생성자

피아니스트 생성자

이름: 홍길동

딩동댕

피아니스트 소멸자

음악가 소멸자

디딤돌 C++