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

C++의 생성자 내에서 가상 함수 호출

<시간/>

생성자 또는 소멸자에서 가상 함수를 호출하는 것은 위험하며 우리가 호출하는 가상 함수는 파생 클래스가 아닌 기본 클래스에서 호출되므로 가능한 한 피해야 합니다.

그 이유는 C++에서 슈퍼 클래스가 파생 클래스보다 먼저 생성되기 때문입니다. 따라서 다음 예에서는 D가 인스턴스화되기 전에 B가 인스턴스화되어야 하므로 B의 생성자가 호출되면 아직 D가 아니므로 가상 함수 테이블에는 여전히 B의 s() 복사본에 대한 항목이 있습니다.

예시 코드

#include<iostream>
using namespace std;
class B {
   public: B() {
      s();
   }
   virtual void s() {
      cout << "Base" << endl;
   }
};

class D: public B {
   public: D() : B() {}
   virtual void s() {
      cout << "Derived" <<endl;
   }
};

int main() {
   D de;
}

출력

Base