개체 지향 언어는 일반적으로 개체를 만들고 삭제할 때 메모리 할당 및 할당 해제를 자동으로 관리합니다. 그러나 일부 개체 지향 언어는 원하는 경우 사용자 지정 소멸자 메서드를 구현할 수 있습니다. 문제의 언어가 자동 메모리 관리를 사용하는 경우 호출되는 사용자 지정 소멸자(일반적으로 이 컨텍스트에서 종료자라고 함)는 해당 개체에 적합한 것으로 확실합니다. 예를 들어 Animal을 상속하는 늑대 형식의 개체가 만들어지고 둘 다 사용자 지정 소멸자가 있는 경우 호출된 개체가 늑대에서 선언된 개체가 됩니다. 개체를 만들도록 요청할 때 간접을 사용하는 기술을 “가상 생성자”라고 도합니다. 예를 들어 TC++PL3 15.6.2를 참조하십시오. 따라서 이러한 모호성을 극복하기 위해 가상 함수가 기본 클래스에서 사용됩니다. 가상 함수는 런타임시 함수 호출을 동적으로 바인딩하고 derrived 클래스의 멤버 함수에 의해 재정의할 수 있습니다. 많은 클래스가 기본 클래스로 사용되도록 설계되지 않았기 때문입니다. 가상 함수는 파생 된 클래스의 개체에 대한 인터페이스 역할을 하는 클래스에서만 의미가 있습니다(일반적으로 힙에 할당되고 포인터 또는 참조를 통해 액세스). 늦은 바인딩(런타임)은 포인터의 내용에 따라 수행되며(즉, 포인터가 가리키는 위치) 및 초기 바인딩(컴파일 시간)은 포인터 유형에 따라 수행되며, print() 함수는 가상 키워드로 선언되므로 런타임(출력은 포인터가 파생 된 클래스의 개체를 가리키므로 인쇄 파생 클래스이며 show()는 비 가상이므로 컴파일 시간 동안 바인딩됩니다(출력은 기본 형식의 포인터와 같이 기본 클래스를 표시함). 가상 함수를 디스패치하는 동안 런타임 시스템은 개체의 v-포인터를 따라 클래스의 v-table에 대한 다음 v-table의 적절한 슬롯을 메서드 코드로 따릅니다.

런타임 다형성의 예로 다음 간단한 프로그램을 고려하십시오. 이 프로그램에 대해 주의해야 할 중요한 점은 파생 클래스의 함수가 기본 클래스 포인터를 사용하여 호출된다는 것입니다. 가상 함수는 포인터 나 참조의 형식에 따라가 아니라 가리키거나 참조하는 개체 인스턴스의 유형에 따라 호출된다는 것입니다. 참고: Circle의 복제() 멤버 함수의 반환 형식은 Shape의 복제() 멤버 함수의 반환 형식과 의도적으로 다릅니다. 이를 원래 언어의 일부가 아닌 기능인 Covariant 반환 유형이라고 합니다. 컴파일러가 클래스 서클 내의 Circle* clone() const의 선언에 불만을 제기하는 경우(예: “반환 형식이 다릅니다” 또는 “멤버 함수의 형식이 반환 형식에 의해 기본 클래스 가상 함수와 다릅니다”) 이전 컴파일러가 있고 반환 유형을 Shape*로 변경해야 합니다. 참조: http://en.wikipedia.org/wiki/Virtual_method_table http://en.wikipedia.org/wiki/Virtual_function http://www.drbio.cornell.edu/pl47/programming/TICPP-2nd-ed-Vol-one-html/Frames.html 순수 가상 함수는 파생 클래스에서 재정의해야 하며 정의할 필요가 없습니다. 가상 함수는 호기심 =0 구문을 사용하여 “순수”로 선언됩니다.

예를 들어, 마지막으로 컴파일러가 가상 함수에 대한 호출을 구현하는 방법을 살펴보겠습니다. 코드는 다음과 같이 보일 수 있습니다 : 우리는 세 가지 포인터 개체 * obj1, * obj2 및 * obj3을 만들었습니다. 이러한 포인터 개체를 사용하여 함수 my_features()를 호출하면 클래스의 해당 함수가 실행됩니다.