Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 비가상 함수 내에서 가상 함수가 호출되면 어떻게 됩니까?


이 섹션에서는 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에 대한 포인터입니다.