가상 함수(virtual function)

기술노트

가상 함수(Virtual Function)

가상 함수는 C++에서 실행 시간 다형성(Run-time Polymorphism)을 구현하기 위한 기능이다. 이 기능은 부모 클래스에서 정의하고, 자식 클래스에서 재정의(오버라이딩)하는 멤버 함수에 적용된다.

가상 함수는 함수 선언 앞에 virtual 키워드를 붙여 선언하며, 프로그램 실행 중 실제 객체의 타입에 따라 호출할 함수를 결정하게 해준다.

특징 및 규칙

클래스의 public 영역에서 선언해야 한다.

가상 함수는 static으로 선언할 수 없다.

다형성을 위해서는 기본 클래스의 포인터 또는 참조를 통해 가상 함수를 호출해야 한다.

자식 클래스에서 재정의할 경우, 반환형과 매개변수는 부모 클래스와 일치해야 한다.

예제 코드

  1. include

using namespace std;

class Parent { public: virtual void v_print() { cout << "Parent" << "\n"; } void print() { cout << "Parent" << "\n"; } };

class Child : public Parent { public: void v_print() override { cout << "Child" << "\n"; } void print() { cout << "Child" << "\n"; } };

int main() { Parent* p; Child c; p = &c;

p->v_print(); // 가상 함수 → 자식 클래스의 함수가 호출됨 p->print(); // 일반 함수 → 부모 클래스의 함수가 호출됨

return 0;

}


실행 결과

설명

p는 Parent 타입의 포인터이지만 실제로는 Child 객체를 가리킨다.

v_print()는 가상 함수이므로 실행 중 객체 타입을 기준으로 자식 클래스의 함수가 호출된다. → 동적 바인딩 또는 후기 바인딩

print()는 일반 함수이므로 컴파일 시간에 결정되어 부모 클래스의 함수가 호출된다. → 정적 바인딩 또는 전기 바인딩

요약

가상 함수는 C++에서 다형성을 실현하는 데 사용된다.

부모 클래스의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체가 자식 클래스라면 자식 클래스의 함수가 실행된다.

가상 함수를 사용하면 동일한 인터페이스로 다양한 동작을 구현할 수 있어 유지보수성과 확장성이 높아진다.