본문/내용
▶ 가상함수의 개요
가상함수(virtual function)는 기본 클래스 내에 선언되고 파생 클래스에 의해 재정의된 클래스 멤버 함수이다. 가상함수를 생성하기 위해서 키워드 virtual을 함수 선언 앞에 쓴다. 가상함수를 포함하는 클래스가 상속될 때 파생 클래스는 그 파생 클래스에 관련되도록 가상함수를 재정의한다. 근본적으로 가상함수는 다형성(polymorphism)의 기본 철학인 `한가지 인터페이스와 여러 가지 방법`을 구현한다. 기본 클래스 내에 있는 가상함수는 그 함수에 대한 인터페이스의 형태를 정의해 준다. 파생 클래스에 의한 가상함수의 재정의는 특히 그 파생 클래스에 관련된 연산을 구현한다. 즉 재정의는 특정한 방법을 생성한다. 가상함수가 파생 클래스에 의해 재정의될 때 키워드 virtual은 필요가 없다.
가상함수는 다른 멤버 함수처럼 호출된다. 그러나 가상함수의 흥미로운 성질 - 그리고 실시간 다형성을 지원하는 능력 - 은 가상함수가 포인터를 사용해서 호출될 때 나타난다. 기본 포인터가 가상함수를 포함하고 있는 파생 객체를 가리키고 가상함수가 그 포인터를 통해 호출될 때, 컴파일러는 포인터가 가리키고 있는 객체의 형에 근거하여 함수의 버전(version)을 결정한다. 바꾸어 말하면 실행될 가상함수의 버전을 결정하는 것은 가리키고 있는 객체의 형이다. 그러므로 만약 가상함수를 포함하고 있는 기본 클래스로부터 두 개 이상의 다른 클래스가 파생되고, 기본 포인터가 다른 객체들을 가리킬 때 가상함수의 다른 버전들이 실행된다. 이 과정이 실시간 다형성이 일어나는 방법이다. 사실 가상함수를 포함하고 있는 클래스를 다형성 클래스(polymorphic class)라고 한다.