[C++] 📂. 상속(Inheritance)
1. 상속성 (Inheritance)
- 자식(파생) 클래스가 부모(기본) 클래스의 멤버들을 포함
- 이미 만들어진 클래스를 포함하기에 코드의 중복 작성을 피할 수 있음
- 상속의 장점
- 간결한 클래스 작성
- 클래스 간의 계층적 분류 및 관리 용이
- 클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상
- 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() 소멸자 호출
- 파생 클래스의 객체가 생성 될때, 파생 클래스의 생성자
선처리 영역
에서 기본 생성자를 호출한다.- 파생 클래스의 소멸자가 호출 된 후 기본 클래스의 소멸자가 호출된다. (생성자와 순서
반대
,후처리 영역
)
✍ 선처리 영역과 후처리 영역
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;
}
댓글남기기