[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++에서 가상 함수와 함수 포인터는 코드의 유연성과 다형성을 높이는 데 중요한 역할을 합니다. 이러한 기능을 적절히 활용하여 객체 지향 프로그래밍 및 복잡한 코드 구조를 더 쉽게 관리할 수 있습니다.

참고 문헌: