가상 함수(Virtual Function)란?

부모 클래스의 함수를 자식 클래스에서 재정의(Override)할 수 있도록 하는 함수


예시

class Animal
{
public:
    virtual void Sound()
    {
        cout << "동물 소리";
    }
};
class Dog : public Animal
{
public:
    virtual void Sound() override
    {
        cout << "멍멍";
    }
};

사용

Animal* AnimalPtr = new Dog();
AnimalPtr->Sound();

출력

멍멍

virtual이 없으면?

class Animal
{
public:
    void Sound()
    {
        cout << "동물 소리";
    }
};
Animal* AnimalPtr = new Dog();
AnimalPtr->Sound();

출력

동물 소리

부모 함수가 호출된다.


왜 사용할까?

실제 객체의 타입에 맞는 함수를 실행하기 위해서

AItem*
ACoinItem
AHealItem
ABuffItem

모두

ActivateItem()

을 가지고 있을 때

Item->ActivateItem();

한 줄로 각 아이템의 동작을 실행할 수 있다.


순수 가상 함수(Pure Virtual Function)

virtual void ActivateItem() = 0;

= 0 이 붙으면 구현이 없는 함수가 된다.

자식 클래스는 반드시 구현해야 한다.


인터페이스에서 사용하는 이유

class IItemInterface
{
public:
    virtual void ActivateItem(AActor* Activator) = 0;
};

인터페이스는 규칙만 정의하므로 보통 순수 가상 함수를 사용한다.


한 줄 정리

가상 함수(Virtual Function)

부모 포인터로 접근하더라도 실제 객체의 함수가 호출되도록 만드는 함수

순수 가상 함수(Pure Virtual Function)

자식 클래스에게 함수 구현을 강제하는 가상 함수 (= 0)이다.