🙇‍♀️다형성 복습

  • 다형성 (Polymorphism = Poly + morph) = 겉은 똑같은데, 기능이 다르게 동작한다
    • 오버로딩(OverLoading) = 함수의 중복 정의 = 함수 이름의 재사용
    • 오버라이딩(Overriding) = 재정의 = 부모 클래스의 함수를 자식 클래스에서 재정의


🪐다형성 복습

class Player
{
public:
	Player()
	{
		_hp = 100;
	}

	void Move() { cout << "Move Player!" << endl; } // 멤버 함수
	void Move(int hp) { _hp = hp; cout << "Move Player(int hp)!" << endl; } // 오버 로딩한 함수 = 함수이름의 재사용
	virtual void VMove() { cout << "Move Player!" << endl; } // 가상함수

public:
	int _hp;
};


class Knight : public Player
{
public:
	Knight()
	{
		_stamina = 100;
	}

	void Move() { cout << "Move Knight!" << endl; } 
    // 오버 라이딩 = 재정의

	virtual void VMove() { cout << "Move Knight!" << endl; } 
    // 가상 함수 구현부

public:
	int _stamina;
};


void VMovePlayer(Player* player)
{
	player->VMove();
}
// 가상 함수는 동적 바인딩이다

void MovePlayer(Player* player)
{
	player->Move();
}

void MoveKnight(Knight* knight)
{
	knight->Move();
}
// 일반 함수는 정적 바인딩이다


int main()
{
	Player p;
	MovePlayer(&p); 
    // 플레이어는 플레이어이다? YES, Player Move함수 호출

	// MoveKnight(&p); 
    // 플레이어는 기사이다? NO Error

	Knight k;
	VMovePlayer(&k); 
    // 가상함수로 Knight Move함수 호출, 동적 바인딩
	MovePlayer(&k); 
    // 기사는 플레이어이다? YES, Player의 Move함수가 나옴
	MoveKnight(&k); 
    // 기사는 기사이다? YES, Knight Move함수 호출 일반 함수로 정적 바인딩

	return 0;
}

동적 바인딩을 하고싶다? -> 가상 함수 사용


  • 그런데 실제 객체가 어떤 타입인지 어떻게 알고 알아서 가상함수를 호출해준걸까?
    • 가상 함수 테이블 (vftable)
    • .vftable [] 4바이트(32) 8바이트(64)
    • [VMove] [VDie]


🪐순수 가상 함수 복습


순수 가상 함수 : 구현은 없고 ‘인터페이스’만 전달하는 용도로 사용하고 싶을 경우 virtual void VAttack() = 0;처럼 구현


추상 클래스 : 순수 가상 함수가 1개 이상 포함되면 바로 추상 클래스로 간주 직접적으로 객체를 만들 수 없게 됨 Player p;처럼 객체를 못만든다


class Player
{
public:
	Player()
	{
		_hp = 100;
	}

	virtual void VMove() = 0;

public:
	int _hp;
};


class Knight : public Player
{
public:
	Knight()
	{
		_stamina = 100;
	}

	virtual void VMove() { cout << "Move Knight!" << endl; } 
    // 무조건 구현해야 됨

public:
	int _stamina;
};


// Player p;
// Error
// 순수 가상 함수를 만들었으므로 객체를 만들 수 없다.

태그:

카테고리:

업데이트: