C++ 프로그램에서 순수 가상 소멸자(pure virtual destructor)를 선언하는 것은 아무런 부작용이 없습니다. 오히려 클래스를 추상 클래스로 만들고 싶지만 마땅한 순수 가상 함수가 없을 때 유용하게 활용할 수 있는 방법입니다.
순수 가상 소멸자에 함수 본문이 필요한 이유
파생 클래스의 소멸자는 기반 클래스의 소멸자보다 먼저 호출됩니다. 따라서 순수 가상으로 선언된 소멸자라 하더라도 반드시 함수 본문(정의)을 제공해야 합니다. 본문을 정의하지 않으면 객체가 소멸되는 과정에서 기반 클래스 소멸자를 호출할 때 실행할 코드가 없어 오류가 발생합니다.
즉, "순수 가상"이라는 선언은 해당 클래스의 인스턴스화를 막는 역할만 할 뿐, 소멸 시점에는 여전히 소멸자가 호출되기 때문에 정의가 반드시 필요합니다.
예제 코드
#include <iostream>
using namespace std;
class B {
public: virtual ~B()=0; // 순수 가상 소멸자
};
B::~B() {
cout << "Pure virtual destructor is called";
}
class D : public B {
public: ~D() {
cout << "~Derived\n";
}
};
int main() {
B *b = new D();
delete b;
return 0;
}실행 결과
~Derived Pure virtual destructor is called
핵심 정리
- 순수 가상 소멸자를 선언하면 클래스가 추상 클래스가 되어 직접 인스턴스를 생성할 수 없습니다.
- 객체 소멸 시 기반 클래스의 소멸자도 함께 호출되므로, 클래스 외부에서 반드시 함수 본문을 정의해야 합니다.
- 정의가 누락되면 링크 단계에서 오류가 발생합니다.