13 분 소요

1. 상속성 (Inheritance)

  • 자식(파생) 클래스가 부모(기본) 클래스의 멤버들을 포함
  • 이미 만들어진 클래스를 포함하기에 코드의 중복 작성을 피할 수 있음
  • 상속의 장점
    1. 간결한 클래스 작성
    2. 클래스 간의 계층적 분류 및 관리 용이
    3. 클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상
  • But! 연관성 없는 클래스를 상속해서는 안됨

    서로 관련있는 클래스들을 상속 관계로 정의해야 객체 지향적 특성이 살아나며, 코드의 재사용성이 높아진다.


2. 상속 선언

  • 선언 방법
      class 파생클래스명 : 상속접근지정자 기본클래스명 {  }
    
    • 상속접근지정자 ⇨ public, private, protected
// 부모 클래스 = 기본 클래스(Base Class)
class Player
{
    public:
        Player() { cout << "Player() 기본 생성자 호출" << endl; }
        Player(double hp) { cout << "Player(double) 생성자 호출" << endl; }
        ~Player() { cout << "~Player() 소멸자 호출" << endl; }
        void Move();
        void Attack();
        void Die();
    
    public:
        int m_hp;
        int m_attack;
        int m_defence;
};

// 자식 클래스 = 파생 클래스(Derived Class)
class Knight : public Player
{
    public:
        Knight() { cout << "Knight() 기본 생성자 호출" << endl; }
        ~Knight() { cout << "~Knight() 소멸자 호출" << endl; }
        // 기본 클래스의 함수 재정의
        void Move();

    public:
        int m_stamina;
};

class Mage : public Player
{
    public:
        Mage() : Player(100) { cout << "Mage() 기본 생성자 호출" << endl; }
        ~Mage() { cout << "~Mage() 소멸자 호출" << endl; }

    public:
        int m_mp;
};

Knight 클래스와 Mage 클래스는 Player 클래스를 상속 받았다.


3. 파생 클래스의 생성자와 소멸자

int main()
{
    Knight k = new Knight();
    cout << endl;

    Mage m = new Mage();
    cout << endl;

    return 0;
}

Output

Player() 기본 생성자 호출
Knight() 기본 생성자 호출

Player(douoble) 생성자 호출
Mage() 기본 생성자 호출

~Mage() 소멸자 호출
~Player() 소멸자 호출
~Knight() 소멸자 호출
~Player() 소멸자 호출
  1. 파생 클래스의 객체가 생성 될때, 파생 클래스의 생성자 선처리 영역에서 기본 생성자를 호출한다.
  2. 파생 클래스의 소멸자가 호출 된 후 기본 클래스의 소멸자가 호출된다. (생성자와 순서 반대, 후처리 영역)
✍ 선처리 영역과 후처리 영역
class Knight
{
    public:
        Knight()
        /*
            선처리 영역
            : 파생 클래스 생성자가 호출되기 전에 기본 생성자 호출
            : Player() 기본 생성자 호출
        */
        {
            // …
        }
        
        ~Knight()
        {
            // …
        }
        /*
            후처리 영역
            : 파생 클래스 소멸자가 호출 된 후 기본 클래스 소멸자 호출
            : ~Player() 소멸자 호출
        */

};


4. 기본 클래스와 파생 클래스의 객체와 멤버 호출

int main()
{
    Knight k = new Knight();
    k.Move(); // Knight의 재정의 된 Move() 함수 호출
    k.Player::Move(); // Player의 Move() 함수 호출

    return 0;
}


📑. 참고

카테고리:

업데이트:

댓글남기기