이 섹션에서는 C++의 가상 클래스에 대한 흥미로운 사실에 대해 논의합니다. 먼저 두 가지 경우를 보고 그 사실을 분석하겠습니다.
-
처음에는 가상 기능을 사용하지 않고 프로그램을 실행합니다.
-
비가상 기능에서 가상 기능을 사용하여 프로그램을 실행합니다.
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <iostream> using namespace std; class BaseClass { public: void display(){ cout << "Print function from the base class" << endl; } void call_disp(){ cout << "Calling display() from derived" << endl; this -> display(); } }; class DerivedClass: public BaseClass { public: void display() { cout << "Print function from the derived class" << endl; } void call_disp() { cout << "Calling display() from derived" << endl ; this -> display(); } }; int main() { BaseClass *bp = new DerivedClass; bp->call_disp(); }
출력
Calling display() from base class Print function from the base class
출력에서 우리는 가상 함수가 비가상 함수 내부에서 호출될 때에도 다형성 동작이 작동함을 이해할 수 있습니다. 어떤 함수가 호출될지는 vptr과 vtable을 적용하여 런타임에 결정됩니다.
-
vtable − 클래스별로 유지 관리되는 함수 포인터 테이블입니다.
-
vptr − 개체 인스턴스별로 유지 관리되는 vtable에 대한 포인터입니다.