본문 바로가기
C++,python (인프런+사이트)/C++ 객체지향 여행

상속성

by 알 수 없는 사용자 2022. 1. 27.

1. 개론

상속이 나온 이유 :

class Knight 와 class Mage 를 보면 멤버변수가 공통될 경우 구조체문법으로 묶어주면 좋다.

그러나 멤버함수까지는 구조체문법으로 묶을 수가 없기 때문에 "상속"개념이 착안됬다. 라고 생각해주면 됨.

 

그래서 보면 구조체 처럼 부모Class를 선언해서 공통된 멤버변수 + 멤버함수를 선언한 후,

부모Class를 각각의 자식class_1 과 자식class_2 에서 "상속"해서 그대로 사용 하거나 재정의 해서 사용한다.

 

부모Class = 자식Class O  --> 개념적으로도 맞고, 포괄한다.

자식Class = 부모Class X   --> size가 자식 Class 쪽이 크거나 같으므로 

- 이유

- - 개념적으로) 모든 Knight는 User다 O ( User = Knight ) , 모든 User는 Knight다 X ( Knight = User )

- - 문법적으로) data의 크기는 User <= Knight 임. 그래서 ( User = Knight )는 Knight 만 가진정보를 버리면 되지만,

                     ( Knight = User )는 Knight 만 가진 data가 채워지지 않아서 문법오류이다.

                     라고 Compiler가 판단함.

 

 

코드

더보기
#include<iostream>
using namespace std;

//오늘의 주제 : 상속성

//객체지향 (OOP)
//상속성
//은닉성
//다형성


// 이런식으로 상속 과정을 거쳐서 사용 한다.
// GameObject 안에 Creature 가 있고 Creature안에 player,npc등등이 있는 것처럼
// 
// GameObject
// -- creature
// ---- Player, Monster , Npc , Pet
// -- projectile
// ---- Arrow , Fireball
// -- Env (환경)
//
// Item
// -- Weapon
// ---- Sword , Bow
// -- Armor
// ---- Helmet, Boots, Armor
// -- consumarble
// ---- Potion, Scroll
class GameObject
{
public:
	int _objectid;
};

class Player : public GameObject
{
public:
	void Move() { cout << " Player Move호출" << endl; }
	void Attack() { { cout << " Player Attack호출" << endl; } }
	void Die() {}
public:
	int _hp;
	int _attack;
	int _defence;
};

//class는 일종의 설계도
//[ [ Player ] ]
//[	   Knight  ]
class Knight : public Player
{
public:
	void Attack() { { cout << " Knight Attack호출_재정의" << endl; } }
public:
	int _Knight_stamina;
};

class Mage : public Player
{
public:

public:
	int _mp;
};

int main()
{
	Knight k;
	k._hp = 5;
	k._attack = 10;
	k._defence = 20;
	k._Knight_stamina = 40;

	k.Move();
	k.Attack();
	k.Player::Attack();

	return 0;
}

 

 

2. 상속될때 메모리 형태( Knight k )

Knight k 의 주소 "&k"를 보면 멤버변수에 대한 값이 순서대로 들어가 있다.

 

 

3. 선처리 영역( 부모Class의 생성자가 먼저 호출되는 이유 ) - 어셈블리어로 확인

자식Class의 생성자 호출 전 "선처리 영역"에서 부모Class를 호출하는 부분이 생략되어 있다. ( 소멸자도 역순으로 같다 )

자식Class 선처리 -> 부모Class 생성자 -> 자식Class 생성자

자식Class 소멸자 -> 자식Class 선처리? -> 부모Class 소멸자

디스어셈블리로 디버깅해서 보면 확인 가능

 

4. 상속성의 활용 예시

// 이런식으로 상속 과정을 거쳐서 사용 한다.
// GameObject 안에 Creature 가 있고 Creature안에 player,npc등등이 있는 것처럼

// GameObject
// -- creature
// ---- Player, Monster , Npc , Pet
// -- projectile
// ---- Arrow , Fireball
// -- Env (환경)
//
// Item
// -- Weapon
// ---- Sword , Bow
// -- Armor
// ---- Helmet, Boots, Armor
// -- consumarble
// ---- Potion, Scroll

'C++,python (인프런+사이트) > C++ 객체지향 여행' 카테고리의 다른 글

다형성  (0) 2022.01.27

댓글