승쨩개발공부

[C++] 상속 본문

C++

[C++] 상속

SeungHyune 2021. 12. 3. 02:45

상속

부모 클래스가 가진 것을 자식 클래스에게 물려주는 것.

-> 연관 있는 클래스에게 물려주겠다.

 

부모 클래스가 자식 클래스에게 물려준다해도 부모 클래스가 가지고 있는 것은 잃지 않는다.

-> 복사해서 물려준다.

 

상속을 구현할 떄 자식 클래스에서 어떤 부모 클래스를 상속 받을지 명시한다.

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