가상 함수(Virtual Function)란 무엇인가요?
가상 함수는 기반(부모) 클래스에서 선언만 하고 정의를 비워두어, 파생(자식) 클래스에서 재정의(오버라이드)하도록 설계된 멤버 함수입니다. 순수 가상 함수의 경우 기반 클래스에서 = 0으로 선언하여 본문을 남기지 않으며, 실제 구현은 자식 클래스에서 이루어집니다. 가상 함수는 런타임 다형성을 구현하는 핵심 도구로, 포인터나 참조를 통해 호출될 때 객체의 실제 타입에 맞는 함수가 실행되도록 보장합니다.
추상 클래스(Abstract Class)란 무엇인가요?
추상 클래스는 정의 안에 최소 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 추상 클래스는 절대로 인스턴스화(객체 생성)할 수 없으며, 오직 상속을 통해서만 사용할 수 있습니다. 파생 클래스는 추상 클래스의 순수 가상 함수를 반드시 구현(재정의)해야 하며, 이를 구현하지 않으면 해당 파생 클래스 역시 추상 클래스로 남게 됩니다.
가상 소멸자(Virtual Destructor)가 존재할 수 있나요?
네, 가능합니다. C++에서 가상 소멸자는 완전히 유효하며, 실무에서도 적극적으로 권장됩니다. 특히 기반 클래스 포인터로 파생 클래스 객체를 동적 할당한 후 delete로 해제할 때, 소멸자가 가상으로 선언되어 있지 않으면 기반 클래스의 소멸자만 호출되어 자원 누수가 발생할 수 있습니다. 따라서 다형적으로 사용될 기반 클래스에는 반드시 가상 소멸자를 선언하는 것이 좋습니다.
모든 가상 함수는 반드시 재정의해야 하나요?
아니요. 일반 가상 함수는 반드시 재정의할 필요가 없습니다. 파생 클래스에서 재정의하지 않으면 기반 클래스에 정의된 버전이 그대로 사용됩니다. 다만 순수 가상 함수(= 0)는 예외로, 파생 클래스에서 반드시 구현해야 한다는 점을 기억해야 합니다.
생성자를 가상(Virtual)으로 만들 수 있나요?
아니요, 생성자는 가상일 수 없습니다. 생성자는 객체가 생성되는 시점에 해당 객체의 정확한 타입을 알고 있어야 하며, 가상 함수 메커니즘(가상 함수 테이블, vtable)은 객체 생성이 완료된 이후에 작동하기 때문입니다. 반면 소멸자는 가상으로 선언할 수 있다는 점과 함께 기억해 두면 좋습니다.