클래스에 상속을 사용함에 있어서는
꼭 필요할때만 상속을써야지 너무 남발하면 좋지 못하다
상속의 조건
1. is -a 관계가 성립 // 플레이어는 유닛이다
2. has - a 관계가 성립 // 소유의 개념
// 플레이어 무기를 사용한다() 함수에서 칼을 휘두루다() 함수를 호출 하는것
has - a 관계는 포함 이라는 방법을 통해서 표현한다
//EXAMPLE
class CSword
{
public:
void Swing()
{
cout << "휘두르다 " << endl;
}
};
class CPlayer
{
private:
CSword m_Sword;
public:
void Attack()
{
m_Swrod.Swing();
}
};
//객체 포인터 사용
class CPlayer
{
private:
CSword* m_pSword;
public:
void Attack()
{
m_pSwrod->Swing();
}
CPlayer(void)
{
m_pSword = new CSword;
}
~CPlayer(void)
{
if(m_pSword != NULL)
{
delete m_pSword;
m_pSword = NULL;
}
}
};
void main(void)
{
CPlayer player;
player.Attack(); // 휘두루다!
}
////////////////////////////////////////////////////
객체 포인터 - 객체의 주소를 저장할수있는 포인터 변수
부모 클래스 타입의 포인터는 자식객체의 주소를 저장할수있다
////
class CObj
{
public:
void Init() {cout << "Init" << endl;
};
class CPlayer : public CObj
{
public:
void Play() {cout << "Play" << endl; }
};
class CMonster : public CObj
{
public:
void Run() {cout << "Run" << endl; }
};
void main(void)
{
CObj* pObj = new CObj;
CObj* pPlayer = new CPlayer;
CObj* pMonster = new CMonster;
pObj->Init();
pPlayer->Init();
pMonsyer->Init();
// 함수 호출에 문제가 없다
pPlayer->Play();
pMonster->Run();
//위 두개는 실행되지 않는다
//부모클래스 포인터로 자식객체의 주소를 담을수는 있으나 볼수있는영역은 해당포인터 만큼 한정지어 진다
//각 클래스의 포인터는 최후 자식클래스를 가리킬수있지만 접근할수있는 범위는 각자의 클래스 내의 함수로 한정된다.
delete pObj;
delete pPlayer;
delete pMonster;
}
//////////////////////////////////////
class A
{
public:
void a(){cout << "a() 함수!!" << endl;}
};
class B : public A
{
public:
void b(){cout << "b() 함수!!" << endl;}
};
class C : public B
{
public:
void c(){cout << "c() 함수!!" << endl;}
};
void main(void)
{
C* c = new C;
B* b = c; // c 는 C* 타입의 변수이기때문에 대입이 가능함
A* a = b;
a->a();
b->a();
b->b();
b->c(); // 이건 실행 불가
c->a();
c->b();
c->c();
}
'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글
오버라이딩_virtual (0) | 2015.10.13 |
---|---|
캐스팅연산 (0) | 2015.10.12 |
깊은복사 얕은복사 (0) | 2015.10.06 |
static (0) | 2015.10.06 |
함수 오버로딩 (0) | 2015.10.05 |
댓글