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

[C++] 파생 개체 생성 과정 및 초기화

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

5.1.2 파생 개체 생성 과정 및 초기화

 

 파생 개체가 생성될 때는 먼저 기반 클래스 부분이 형성된 후에 파생 클래스 부분이 형성됩니다. , 기반 클래스의 생성자 메서드가 수행된 후에 파생 클래스의 생성자 메서드가 수행됩니다. 그리고 파생 개체가 소멸될 때는 역으로 파생 클래스의 소멸자 메서드가 수행되고 나서 기반 클래스의 소멸자 메서드가 수행됩니다.

 

 만약, 기반 클래스에 입력 매개 변수가 없는 생성자(기본 생성자)가 정의되지 않고 매개 변수가 있는 생성자만 정의된 경우에는 파생 개체가 생성될 때 어떻게 될까요?

 

파생 개체가 생성되기 위해선 기반 클래스의 생성자 메서드 부분이 수행이 되어야 하는데, 인자를 어떤 값으로 전달할 것인지 컴파일러가 결정하지 못합니다. 이 경우에 파생된 클래스의 소스 코드에서 멤버 필드 초기화하는 방식처럼 초기화 작업을 해 주어야 합니다. 그렇지 않으면 오류가 발생합니다.

 

Pianist::Pianist(const char *_name):Musician(_name)

{

} 

 

 다음의 예에서는 기반 클래스인 Musician 클래스에 입력 매개 변수로 이름을 인자로 받는 생성자 메서드를 정의하고 파생 클래스인 Pianist 클래스에서 초기화 기법을 사용하여 기반 클래스의 생성자 메서드 호출 시에 적절한 인자를 전달하는 코드입니다

 

 그리고, Musician에 있는 이름 필드에 대한 접근 지정이 디폴트인 private으로 설정하였을 때 이를 파생된 클래스인 Pianist 클래스에서 얻어올 수 있게 하는 부분도 살펴보시기 바랍니다. 이를 위해 Musician 클래스에 이름을 반환하는 메서드를 만들고 이에 대한 접근 지정을 protected로 설정함으로써 Pianist 클래스에서 접근할 수 있게 하였습니다.

 

Musician.h

#pragma once

#include <iostream>

using std::cout;

using std::endl;

#include <string>

using std::string;

 

class Musician

{

    const string name;

public:

    Musician(string _name);

    virtual ~Musician(void);

    void Play();

    void Greeting()const;

protected:

    string GetName()const;//파생 클래스에서 가시성이 있음

};

 

  

Musicain.cpp

#include "Musician.h"

 

Musician::Musician(string _name):name(_name)

{

    cout<<name<<"Musician 생성자 메서드"<<endl;

}

Musician::~Musician(void)

{

    cout<<name<<"Musician 소멸자 메서드"<<endl;

}

void Musician::Play()

{

    cout<<name<<" 연주하다."<<endl;

}

void Musician::Greeting()const

{

    cout<<name<<" 인사하다."<<endl;

}

string Musician::GetName()const

{

    return name;

}

 

 

Pianist.h

#pragma once

#include "Musician.h"

class Pianist : public Musician

{

public:

    Pianist(string _name);

    ~Pianist();

    void Tuning();

};

 

  

Pianist.cpp

#include "Pianist.h"

Pianist::Pianist(string _name):Musician(_name)

{

    cout<<GetName()<<"Pianist 생성자 메서드"<<endl;

}

Pianist::~Pianist()

{

    cout<<GetName()<<"Pianist 소멸자 메서드"<<endl;

}

void Pianist::Tuning()

{

    cout<<GetName()<<" 조율하다."<<endl;

}

 

 

Test.cpp

#include "Pianist.h"

void main()

{

    Pianist *pianist = new Pianist("홍길동");

    pianist->Play();

    pianist->Greeting();

    pianist->Tuning();

    delete pianist;

}

 


파생 개체 생성 과정 및 초기화

[그림 5. 3]

 

[그림 5.3] 실행 화면을 보시면 파생 개체의 생성은 기반 클래스 è 파생 클래스 순으로 생성되고 소멸은 역순으로 소멸하는 것을 확인하실 수 있습니다.


 

5장 

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

반응형