C++ 순수 가상 함수란?
순수 가상 함수(pure virtual function)는 C++에서 함수의 정의(구현부) 없이 선언만 하는 가상 함수를 말합니다. 선언할 때 함수 이름 뒤에 = 0을 붙여 표시하는 것이 특징입니다.
그렇다면 왜 하필 0을 대입할까요? 사실 여기에는 복잡한 기술적 비밀이 숨어 있지 않습니다. = 0은 실제로 0이라는 값을 함수에 대입하는 연산이 아니라, "이 함수는 순수 가상 함수다"라고 컴파일러와 프로그래머에게 알려주는 특수한 문법(syntax)일 뿐입니다. 그 이상의 의미는 없습니다.
순수 가상 함수가 필요한 이유
순수 가상 함수는 다음과 같은 상황에서 유용하게 사용됩니다.
- 추상 클래스 설계: 순수 가상 함수를 하나라도 포함한 클래스는 추상 클래스(abstract class)가 되어 객체를 직접 생성할 수 없습니다.
- 인터페이스 강제: 파생 클래스가 반드시 해당 함수를 오버라이드(재정의)하도록 강제하여 일관된 인터페이스를 보장합니다.
- 다형성 지원: 기반 클래스의 포인터나 참조를 통해 파생 클래스에서 구현한 함수를 호출할 수 있습니다.
예제 코드
#include<iostream>
using namespace std;
class B {
public:
virtual void s() = 0; // 순수 가상 함수
};
class D : public B {
public:
void s() {
cout << "Virtual Function in Derived class\n";
}
};
int main() {
B *b;
D dobj;
b = &dobj;
b->s();
}실행 결과
Virtual Function in Derived class
코드 설명
클래스 B의 멤버 함수 s()는 = 0으로 선언된 순수 가상 함수입니다. 따라서 B는 추상 클래스가 되어 객체를 직접 생성하려 하면 컴파일 오류가 발생합니다.
대신 B 타입의 포인터 b를 선언하고, s()를 오버라이드한 파생 클래스 D의 객체 주소를 대입했습니다. 그 결과 b->s()를 호출하면 파생 클래스에서 구현한 함수가 실행됩니다. 이것이 순수 가상 함수를 활용해 다형성(polymorphism)을 구현하는 전형적인 패턴입니다.