다형성

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

다형성:  오버로딩  vs.  오버라이딩

 

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

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

 


 

오버로딩과 오버라이딩

 

#include <iostream>
using namespace std;

class Player{
public:
    void Move() { cout << "Move Player! " << endl; }
    void Move(int a) { cout << "Move Player (int)! " << endl; }  // 오버로딩 예시
    
public:
    int _hp;
};

class Knight : public Player // public Player. public 안 적으면 private으로 인식
{
public:
    void Move() { cout << "Move Knight! " << endl; } // 재정의. 오버라이딩

public:
    int _stamina;
};

class Mage : public Player
{
public:
    int _mp;
};

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

void MoveKnight(Knight* knight)
{
    knight->Move();
}

int main()
{
    Knight kk;
    kk.Move();

    cout << "------------------------" << endl;

    Player p;
    MovePlayer(&p);    // Player는 Player다? YES
    //MoveKnight(&p)  // Player는 Knight다? NO  // 잘못된 코딩 // 자식 클래스에서 부모 클래스로 넘어가는건 되지만 그 반대의 경우는 자연스럽게 되지 않는다.

    Knight k;
    MoveKnight(&k); // Knight는 Knight다? YES
    MovePlayer(&k); // Knight는 Player다? YES  // 자식 클래스에서 부모 클래스로 넘어가는건 자연스럽다

    return 0;
}

 

실행화면


 

 

바인딩(Binding)  -  정적 바인딩,  동적 바인딩

 

바인딩(Binding)  = 묶는다.

   
정적 바인딩(Static Binding)   컴파일 시점에 결정
동적 바인딩(Dynamic Binding)   실행 시점에 결정

일반 함수는 정적 바인딩을 사용한다.

 

동적 바인딩을 원한다면? 

  • 가상 함수(virtual function)를 사용한다.

 

#include <iostream>
using namespace std;

class Player{
public:
    void Move() { cout << "Move Player! " << endl; }    
    virtual void VMove() { cout << "Move Player! " << endl; }

public:
    int _hp;
};

class Knight : public Player // public Player. public 안 적으면 private으로 인식
{
public:
    void Move() { cout << "Move Knight! " << endl; } // 재정의. 

    // 가상 함수는 재정의를 하더라도 가상 함수다!
    virtual void VMove() { cout << "Move Knight! " << endl; }  

public:
    int _stamina;
};

class Mage : public Player
{
public:
    int _mp;
};

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

int main()
{
    Player p;
    
    Knight k;
    
    MovePlayer(&k); 

    return 0;
}

 

실행화면

재정의한 VMove()가 호출된다.

'⭐ Programming > C++' 카테고리의 다른 글

[C++] 초기화 리스트  (0) 2022.04.05
[C++] 다형성, 가상함수 테이블, 순수 가상함수, 추상 클래스  (0) 2022.04.05
[C++] 은닉성  (0) 2022.04.04
[C++] 상속성  (0) 2022.04.04
[C++] 생성자와 소멸자 2  (0) 2022.04.04