C++ Rookiss Part1 C++ 프로그래밍 입문 : 다형성
🙇♀️다형성
다형성(Polymorphism = Poly + morph) = 겉은 똑같은데, 기능이 다르게 작동한다.
- 오버로딩(Overloading) = 함수 중복 정의 = 함수 이름의 재사용
- 오버라이딩(Overriding) = 재정의 = 부모 클래스의 함수를 자식 클래스에서 재정의
🪐다형성
- 오버로딩(Overloading)
- 함수 이름의 재사용.
void Move() {}
의 이름을 재사용하기 위해void Move(int a) {}
처럼 재사용 가능하다.- 단,
int Move() {}
처럼 반환 형식의 변화만으로는 오버로딩을 할 수 없다.
- 오버라이딩(Overriding)
- 재정의
- 부모 클래스의 함수를 자식 클래스에서 재정의하는 것.
🪐바인딩
- 바인딩(Binding) = 묶는다
- 정적 바인딩(StaticBinding) : 컴파일 시점에 결정
- 동적 바인딩(DynamicBinding) : 실행 시점에 결정
- 일반 함수는 정적 바인딩을 사용
- 동적 바인딩을 원한다면? -> 가상 함수 (virtual function)
- 가상함수가 필요한 경우
class Player
{
public:
void Move() { cout << "Move Player!" << endl; }
};
class Knight : public Player
{
public:
void Move() { cout << "Move Knight!" << endl; }
};
이런 클래스 상태 일 때
void MovePlayer(Player* player)
{
player->Move();
}
이런 함수를 만들었다고 하자. 메인함수에서 Knight
를 만들고 MovePlayer
를 사용하면 부모 클래스의 함수가 실행된다.
이럴 때 가상함수가 필요하다.
- 부모 클래스 함수가 실행되는 이유
일반 함수는 정적 바인딩을 사용하기 때문이다.
정적 바인딩은 컴파일 시점에서 결정되기에
void MovePlayer(Player* player)
의Player* player
부분을 보기 때문이다.
그렇다면 실행 시점에서 결정되기 위해 동적 바인딩을 사용하면 된다. 동적 바인딩을 사용한다? -> 가상 함수를 사용한다!
- 가상함수
가상함수는 반환형식 앞에 virtual
을 붙여준다.
ex) virtual void VMove() { cout << "Move Player!" << endl; }
부모 클래스에서 가상함수를 만들고 자식또한 가상함수로 재정의하면 위의 문제를 해결 할 수 있다.
가상함수는 한번 만들면 영원히 가상함수이다! (자식 클래스에서 virtual
을 안붙여도 가상함수임!)
virtual void VMove() { cout << "Move Knight!" << endl; }
이렇게 자식 클래스에 만들어주고 메인함수에서 Knight
를 만든뒤 MovePlayer
를 사용한다면 Move Knight!가 출력된다!
🪐가상함수의 원리
가상함수를 만들면 메모리 상에서 변화가 일어난다.
“C:\stopresent\사진\CPP사진\가상 함수 메모리.png”