본문 바로가기
IT 컴퓨터_프로그램 /c++

클래스_상속

by 건축직일상 2015. 10. 12.

클래스에 상속을 사용함에 있어서는

꼭 필요할때만 상속을써야지 너무 남발하면 좋지 못하다


상속의 조건 

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

댓글