승쨩개발공부
[C++] 상속 본문
상속
부모 클래스가 가진 것을 자식 클래스에게 물려주는 것.
-> 연관 있는 클래스에게 물려주겠다.
부모 클래스가 자식 클래스에게 물려준다해도 부모 클래스가 가지고 있는 것은 잃지 않는다.
-> 복사해서 물려준다.
상속을 구현할 떄 자식 클래스에서 어떤 부모 클래스를 상속 받을지 명시한다.
class 자식클래스명 : 부모클래스명
상속의 조건
부모 클래스를 상속 받을 떄 어떤 조건으로 상속 받을지 설정할 수 있다.
조건(기본 접근 지정자)을 설정하지 않을 경우 기본 private 형태로 상속을 받는다.
class A(부모)
{
public:
void A_Func()
{
}
};
class B(자식) : public A(부모)
{
public:
void B_Func()
{
}
}
상속 관계에서의 생성자와 소멸자 호출 순서
생성 과정
객체 생성 -> 메모리 할당 -> 부모 생성자 호출 -> 자식 생성자 호출
소멸 과정
자식 소멸자 호출 -> 부모 소멸자 호출 -> 메모리 반환 -> 객체 소멸
상속의 관계
-> 상속 관계를 구성할 때 조건에 맞도록 구성해야한다.
##1. is-a 관계
class CPlayer : public CObj
Player is a Object
-> 플레이어는 오브젝트이다
자연스럽게 문장이 성립한다
Object is a Player
-> 오브젝트는 플레이어이다
모든 오브젝트가 플레이어는 아니다. ex) 몬스터, 돌, 나무 등 환경 오브젝트
##2. has-a 관계
is-a 관계가 모두 어색할 경우에는 has-a 관계를 사용하자
Player is a Sword
-> 플레이어는 검이다.
문장이 성립하지 않는다.
Sword is a Player
-> 검은 플레이어다
문장이 성립하지 않는다.
Sword has a Player
-> 검은 플레이어를 가진다
문장이 성립하지 않는다.
Player has a Sword
-> 플레이어는 검을 가진다
문장이 성립한다.
has-a 관계의 문제점
지금 플레이어는 검이라는 무기 하나밖에 없다.
플레이어는 다양한 무기를 사용할 수 있다.
이러한 문제를 해결하기 위해서 다중 상속을 사용하면 된다.
다중 상속
, 를 이용해서 여러 부모 클래스를 명시할 수 있다.
-> 다중 상속을 사용하면 여러 클래스들을 상속 받을 수 있다.
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;
};
'C++' 카테고리의 다른 글
[C++] 오버라이딩 (0) | 2021.12.03 |
---|---|
[C++] 객체 포인터 (0) | 2021.12.03 |
[C++] this포인터, extern, friend (0) | 2021.12.03 |
[C++] 복사 생성자(얕은복사, 깊은복사) (0) | 2021.12.03 |
[C++] static과 클래스, 멤버함수 (0) | 2021.12.02 |