[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
함수는 가상 함수로 선언되었습니다. Dog
와 Cat
클래스에서 이 함수를 재정의했으며, main
함수에서는 animal1
과 animal2
가 각각 Dog
와 Cat
객체를 가리키고 있음에도 불구하고 올바른 makeSound
함수가 호출됩니다.
이러한 간단한 예제를 통해 C++에서의 가상 함수와 런타임 다형성의 개념과 활용에 대해 이해할 수 있습니다.
[참고 자료]
- https://en.cppreference.com/w/cpp/language/virtual
- https://en.cppreference.com/w/cpp/language/override