virtual function 예제

여기서 설명한 대로 클래스에 가상 함수가 포함되어 있으면 컴파일러 자체는 순수 지정자를 사용하여 선언하지 않는 한 기본 클래스의 가상 함수를 정의해야 합니다. 순수 가상 함수에 대한 자세한 내용은 추상 클래스를 참조하십시오. 가상 함수는 파생 클래스에서 재정의되는 기본 클래스의 멤버 함수입니다. 가상 함수가 있는 클래스를 다형성 클래스라고 합니다. 가상 멤버 함수는 이전 코드가 새 코드를 쉽게 호출할 수 있도록 하는 것과 같이 개체 지향 패러다임의 핵심입니다. 가상 함수를 디스패치하는 동안 런타임 시스템은 개체의 v-포인터를 따라 클래스의 v-table에 대한 다음 v-table의 적절한 슬롯을 메서드 코드로 따릅니다. 파생 클래스 자동차와 트럭기본 클래스 차량이 있다고 가정합니다. 코드는 차량 객체 목록을 통과하며 차량 유형에 따라 다른 작업을 수행합니다. 예를 들어 트럭 물체의 무게를 측정하여(적재량이 너무 무거워지지 않도록) 자동차 객체와 다른 작업을 수행할 수 있습니다.

앞의 코드에서 PrintBalance에 대한 호출은 개체 pAccount 가리키는 것을 제외하고 동일합니다. PrintBalance는 가상이므로 각 개체에 대해 정의된 함수 버전이 호출됩니다. 파생 클래스의 PrintBalance 함수 는 회계 계정 및 저축 계정기본 클래스 계정의 함수를 “재정의”합니다. 컴파일러는 런타임에 가상 함수를 바인딩하므로 런타임 다형성이라고 합니다. 가상 함수를 사용하면 프로그램이 런타임시 포인터가 가리키는 개체의 형식에 따라 호출할 함수를 결정할 수 있습니다. 또한 가상 함수가 있는 클래스의 개체에는 가상 함수 호출 메커니즘(일반적으로 개체당 한 단어)에 필요한 공간이 필요합니다. 이 오버헤드는 중요할 수 있으며 다른 언어(예: C 및 Fortran)의 데이터와 레이아웃 호환성을 얻을 수 있습니다. 예를 들어, 추상 기본 클래스 MathSymbol 순수 한 가상 함수 doOperation()를 제공할 수 있습니다 및 파생 된 클래스 플러스 및 마이너스 구현 doOperation() 구체적인 구현을 제공 하. MathSymbol은 수학 기호의 각 지정된 종류(하위 클래스)에 대해서만 정의된 추상 개념이기 때문에 doOperation()을 구현하는 것은 MathSymbol 클래스에서 의미가 없습니다. 마찬가지로 MathSymbol의 지정된 하위 클래스는 doOperation()을 구현하지 않으면 완전하지 않습니다.

컴파일러는 하나 이상의 가상 함수가 있는 각 클래스에 대해 v 테이블을 만듭니다. 예를 들어, 클래스 Circle에 draw() 및 move() 및 크기 조정()에 대한 가상 함수가 있는 경우, gazillion Circle 개체가 있더라도 클래스 Circle과 연결된 V 테이블이 하나 있으며 각 원 오브젝트의 v-포인터가 원형 v-테이블.