상속
-> 부모 클래스가 가진 것을 자식 클래스에게 물려주는 것.
-> 프로그래밍에서 물려주는 것은 복사 후 붙여넣기 이다.
상속을 구현할 때 자식 클래스에서 어떤 부모클래스를 상속 받을지 명시한다.
class 자식클래스명 : 부모클래스명
상속의 조건
-> 부모 클래스를 상속 받을 때 어떤 조건으로 상속 받을지 설정할 수 있다.
-> 조건(기본 접근 지정자)을 설정하지 않을 경우 기본 private 형태로 상속을 받는다.
class A(부모)
{
public:
void A_Func()
{
}
};
class B(자식) : public A(부모)
{
public:
void B_Func()
{
}
}
상속 관계에서의 생성자와 소멸자 호출 순서.
생성 과정
객체 생성 -> 메모리 할당 -> 부모 생성자 호출 -> 자식 생성자 호출
소멸 과정
자식 소멸자 호출 -> 부모 소멸자 호출 -> 메모리 반환 -> 객체 소멸
상속의 관계
-> 상속 관계를 구성할 때 조건에 맞도록 구성해야한다.
#1. is-a 관계
Object is a Player
-> 오브젝트는 플레이어다.
모든 오브젝트가 플레이어가 아니다! -> 문장이 성립하지 않는다.
Player is a Object
-> 플레이어는 오브젝트이다.
문장이 성립한다.
#2. has-a 관계
Player is a Sword
-> 플레이어는 검이다!
문장이 성립하지 않는다.
Sword is a Player
-> 검은 플레이어이다!
문장이 성립하지 않는다.
Player has a Sword
-> 플레이어는 검을 가진다.
문장이 성립된다.
다중 상속이란?
-> 다중 상속을 이용하면 여러 클래스들을 상속 받을 수 있다.
class CAxe
{
public:
void Swing()
{
cout << "CAxe Swing" << endl;
}
};
class CSword
{
public:
void Swing()
{
cout << "CSword Swing" << endl;
}
};
class CPlayer : public CSword, public CAxe
{
public:
CSword m_Sword;
CAxe m_Axe;
};
-> 단, 다중 상속은 모호성이 가장 큰 문제이다.
CPlayer player;
player.Swing();
플레이어는 검과 도끼를 상속 받은 상태이다.
이후 Swing을 호출할 때 검의 Swing인지 도끼의 Swing인지 알 수 없는 상황이 발생한다.
이를 방지하기위해서 has-a 관계가 성립될 경우에는 상속을 받지 않고, 포함 관계로 구성하는 것이 좋다.
포함 관계란?
-> 상속을 받는 것이 아니라, 멤버로 객체를 포함시키는 것이다.
class CPlayer
{
public:
CSword m_Sword;
CAxe m_Axe;
};
'Programming > C++ Basic' 카테고리의 다른 글
C++ 오버라이딩 (0) | 2020.09.18 |
---|---|
C++ 객체 포인터 (0) | 2020.09.17 |
C++ friend (0) | 2020.09.17 |
C++ this 포인터, extern 키워드 (0) | 2020.09.16 |
C++ 복사 생성자(얕은 복사, 깊은 복사) (0) | 2020.09.16 |