C++ Rookiss Part1 C++ 프로그래밍 입문 : 다형성 복습
🙇♀️다형성 복습
- 다형성 (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
// 순수 가상 함수를 만들었으므로 객체를 만들 수 없다.