[c++] 가상 함수와 함수 포인터(function pointer)의 사용
C++에서 가상 함수와 함수 포인터는 객체 지향 프로그래밍 및 다형성(polymorphism)을 구현하는 데 중요한 요소입니다. 이 두 가지 개념은 객체 지향 언어인 C++에서 코드의 재사용성과 유연성을 높이는 데 도움이 됩니다.
가상 함수 (Virtual Functions)
가상 함수는 동적 공통 연결(Dynamic Dispatch)을 통해 이루어집니다. 기본 클래스(Base class)에서 가상 함수를 정의하고 파생 클래스(Derived class)에서 오버라이딩하는 것을 통해 다형성을 구현할 수 있습니다.
가상 함수 사용하기
가상 함수를 사용하려면 함수 선언 앞에 virtual
키워드를 사용해야 합니다.
class Base {
public:
virtual void display() {
cout << "Base class display function" << endl;
}
};
class Derived : public Base {
public:
void display() {
cout << "Derived class display function" << endl;
}
};
int main() {
Base *basePtr;
Derived derivedObj;
basePtr = &derivedObj;
basePtr->display(); // Derived class display function 호출
return 0;
}
위의 예시에서 Base
클래스의 display
함수가 가상 함수로 정의되었기 때문에 Derived
클래스의 display
함수가 호출됩니다.
함수 포인터 (Function Pointers)
함수 포인터는 C++에서 함수를 가리키는 포인터입니다. 이를 통해 함수를 인수로 전달하거나 함수 내에서 동적으로 호출할 수 있습니다.
함수 포인터 사용하기
#include <iostream>
using namespace std;
void hello() {
cout << "Hello, ";
}
void world() {
cout << "World!" << endl;
}
int main() {
void (*functionPtr)(); // 함수 포인터 선언
functionPtr = hello;
(*functionPtr)(); // Hello, 출력
functionPtr = world;
(*functionPtr)(); // World! 출력
return 0;
}
(*functionPtr)()
를 통해 함수를 호출할 수 있습니다.
결론
C++에서 가상 함수와 함수 포인터는 코드의 유연성과 다형성을 높이는 데 중요한 역할을 합니다. 이러한 기능을 적절히 활용하여 객체 지향 프로그래밍 및 복잡한 코드 구조를 더 쉽게 관리할 수 있습니다.
참고 문헌:
- https://www.learncpp.com/cpp-tutorial/125-the-virtual-table/
- https://www.learncpp.com/cpp-tutorial/925-pointers-to-member-functions/