생성자에서 가상 함수 재정의
다음 코드 조각을 고려하세요.
#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로 인쇄하려면 가상 함수 호출을 피할 수 있습니다. 생성자에서. 이는 다음을 통해 달성할 수 있습니다:
포인터 사용: 멤버 함수에서 직접 호출하는 대신 기본 클래스에 대한 포인터 또는 참조에서 가상 함수를 호출합니다.
base* b = new derived(); b->value(); // Calls the derived class implementation delete b;
멤버 초기화 사용 목록: 멤버 초기화 목록을 사용하여 생성자에서 가상 함수의 값을 명시적으로 지정합니다.
derived d : base() { } // Initializes `base()` and the virtual function // call to occur within the constructor
위 내용은 기본 클래스 생성자에서 가상 함수를 호출하면 기본 클래스 구현이 사용되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!