🙇‍♀️다형성

다형성(Polymorphism = Poly + morph) = 겉은 똑같은데, 기능이 다르게 작동한다.

  • 오버로딩(Overloading) = 함수 중복 정의 = 함수 이름의 재사용
  • 오버라이딩(Overriding) = 재정의 = 부모 클래스의 함수를 자식 클래스에서 재정의

🪐다형성

  • 오버로딩(Overloading)
    • 함수 이름의 재사용.
    • void Move() {}의 이름을 재사용하기 위해 void Move(int a) {}처럼 재사용 가능하다.
    • 단, int Move() {}처럼 반환 형식의 변화만으로는 오버로딩을 할 수 없다.
  • 오버라이딩(Overriding)
    • 재정의
    • 부모 클래스의 함수를 자식 클래스에서 재정의하는 것.

🪐바인딩

  • 바인딩(Binding) = 묶는다
    • 정적 바인딩(StaticBinding) : 컴파일 시점에 결정
    • 동적 바인딩(DynamicBinding) : 실행 시점에 결정
  • 일반 함수는 정적 바인딩을 사용
  • 동적 바인딩을 원한다면? -> 가상 함수 (virtual function)
  1. 가상함수가 필요한 경우
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를 사용하면 부모 클래스의 함수가 실행된다. 이럴 때 가상함수가 필요하다.

  1. 부모 클래스 함수가 실행되는 이유 일반 함수는 정적 바인딩을 사용하기 때문이다. 정적 바인딩은 컴파일 시점에서 결정되기에 void MovePlayer(Player* player)Player* player부분을 보기 때문이다.

그렇다면 실행 시점에서 결정되기 위해 동적 바인딩을 사용하면 된다. 동적 바인딩을 사용한다? -> 가상 함수를 사용한다!

  1. 가상함수

가상함수는 반환형식 앞에 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”

태그:

카테고리:

업데이트: