[c++] 가상 함수와 런타임 다형성(runtime polymorphism)

다형성을 구현하는 방법 중 하나는 가상 함수를 사용하는 것입니다. 가상 함수는 기본 클래스(부모 클래스)에서 선언되며 파생 클래스(자식 클래스)에서 재정의될 수 있습니다. 따라서 파생 클래스의 객체가 기본 클래스의 포인터나 참조로 사용될 때, 실제로 호출되는 함수는 객체의 실제 타입에 따라 달라집니다.

가상 함수를 사용하여 런타임 다형성을 구현할 수 있습니다. 이는 실행 시간에 객체의 실제 타입을 기반으로 적절한 함수를 호출할 수 있는 기능을 말합니다. 이를 통해 동적 바인딩(dynamic binding)이 가능하며, 실행 시간에 객체의 동작을 결정할 수 있습니다.

아래는 C++에서 가상 함수와 런타임 다형성을 사용하는 간단한 예제 코드입니다.

#include <iostream>

class Animal {
public:
    virtual void makeSound() {
        std::cout << "Some sound" << std::endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Woof!" << std::endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Meow!" << std::endl;
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->makeSound(); // "Woof!" 출력
    animal2->makeSound(); // "Meow!" 출력
}

위의 예제에서 Animal 클래스의 makeSound 함수는 가상 함수로 선언되었습니다. DogCat 클래스에서 이 함수를 재정의했으며, main 함수에서는 animal1animal2가 각각 DogCat 객체를 가리키고 있음에도 불구하고 올바른 makeSound 함수가 호출됩니다.

이러한 간단한 예제를 통해 C++에서의 가상 함수와 런타임 다형성의 개념과 활용에 대해 이해할 수 있습니다.

[참고 자료]