>백엔드 개발 >C++ >기본 클래스 생성자에서 가상 함수를 호출하면 기본 클래스 구현이 사용되는 이유는 무엇입니까?

기본 클래스 생성자에서 가상 함수를 호출하면 기본 클래스 구현이 사용되는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 02:03:15823검색

Why Does Calling a Virtual Function in a Base Class Constructor Result in the Base Class Implementation Being Used?

생성자에서 가상 함수 재정의

다음 코드 조각을 고려하세요.

#include <iostream>
struct base {
  virtual const int value() const {
    return 0;
  }

  base() { // Default constructor
    std::cout << value() << std::endl;
  }
};

struct derived : public base {
  virtual const int value() const {
    return 1;
  }
};

int main() {
  derived d; // Declares an instance of the derived class
}

이 코드를 실행할 때, 예상되는 1 대신 0을 인쇄합니다. 왜?

생성 중 가상 함수 호출

기본 클래스 생성자가 생성자에서 가상 함수를 호출하면 가상 함수는 기본 클래스 인스턴스에서 호출됩니다. 파생 클래스 인스턴스. 이는 생성 중 객체의 '성숙' 과정의 결과입니다.

  • 성숙: 객체가 생성되면 기본 클래스 생성자에서 시작하여 점차적으로 "성숙"됩니다. "를 파생 클래스 유형에 추가합니다.

이 예에서 기본 생성자는 객체가 부분적으로 생성될 때 value()를 호출합니다. 이 시점에서 개체는 아직 파생 개체로 "성숙"되지 않았습니다. 따라서 value()의 원래 기본 구현이 호출됩니다.

문제 해결 방법

코드를 1로 인쇄하려면 가상 함수 호출을 피할 수 있습니다. 생성자에서. 이는 다음을 통해 달성할 수 있습니다:

  1. 포인터 사용: 멤버 함수에서 직접 호출하는 대신 기본 클래스에 대한 포인터 또는 참조에서 가상 함수를 호출합니다.

    base* b = new derived();
    b->value(); // Calls the derived class implementation
    
    delete b;
  2. 멤버 초기화 사용 목록: 멤버 초기화 목록을 사용하여 생성자에서 가상 함수의 값을 명시적으로 지정합니다.

    derived d : base() { } // Initializes `base()` and the virtual function
                           // call to occur within the constructor
  3. 위 내용은 기본 클래스 생성자에서 가상 함수를 호출하면 기본 클래스 구현이 사용되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.