상속

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

-> 프로그래밍에서 물려주는 것은 복사 후 붙여넣기 이다.

 

 

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

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

+ Recent posts