>백엔드 개발 >C++ >생성자와 소멸자에서 '순수 가상 함수 호출' 오류가 발생하는 이유는 무엇입니까?

생성자와 소멸자에서 '순수 가상 함수 호출' 오류가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-12 12:16:01647검색

Why Do

"순수 가상 함수 호출" 충돌의 수수께끼 풀기

프로그래밍 영역에서 충돌 발생伴随着 "순수 가상 함수 호출" " 오류는 개발자들이 머리를 긁적거리게 만들 정도로 혼란스러울 수 있습니다. 이 글의 목표는 이러한 파악하기 어려운 오류의 근본 원인을 밝히는 것입니다.

순수 가상 함수의 추상성

순수 가상 함수는 객체의 기본 측면입니다. 지향적 프로그래밍, 파생 클래스에서 구현되어야 하는 추상 클래스의 함수 선언을 가능하게 합니다. 설계상 순수 가상 함수는 추상 클래스에 구현되지 않습니다.

범인: 생성자 및 소멸자 호출

그러나 가상 함수 호출이 다음과 같은 경우 문제가 발생합니다. 생성자 또는 소멸자 내에서 시도되었습니다. 이러한 경우에는 본질적인 제한이 적용됩니다. 즉, 객체 초기화 또는 소멸 중 가상 함수 호출이 허용되지 않습니다. 이 제한의 이유는 파생 클래스 개체가 존재하는 단계에서 불완전한 상태에 있기 때문입니다.

기본 클래스 호출

이 금지의 결과로, 생성자나 소멸자에서 가상 함수를 호출하면 해당 함수의 기본 클래스 버전이 호출됩니다. 순수 가상 함수에 기본 클래스 구현이 없으면 이는 문제가 됩니다. 이는 추상 클래스의 경우가 많습니다.

예시

문제를 설명하려면, 다음 C 코드를 고려해 보세요.

class Base {
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base {
    void doIt() {}
};

int main() {
    Derived d; // Triggers "pure virtual function call" error
}

이 예에서 Base 클래스의 reallyDoIt() 함수는 doIt()을 호출합니다. 기능. 그러나 doIt()은 순수 가상 함수이므로 기본 클래스에는 이에 대한 구현이 없습니다. 결과적으로 파생 클래스 객체가 생성되면 생성자에서 doIt() 함수를 호출하려고 시도하여 무서운 "순수 가상 함수 호출" 오류가 발생합니다.

추가 리소스

이 주제에 대해 더 자세히 알아보려면 다음 페이지에 있는 Raymond Chen의 통찰력 있는 기사를 참조하세요. 제목:

  • [Raymond Chen의 블로그: "순수 가상 함수 및 Vptr"(1부)](https://devblogs.microsoft.com/oldnewthing/2007/12/18/pure- virtual-functions-and-the-vptr/)
  • [Raymond Chen의 블로그: "순수한 가상 함수 및 Vptr"(2부)](https://devblogs.microsoft.com/oldnewthing/2007/12/20/pure-virtual-functions-and-the-vptr-part-deux/)

위 내용은 생성자와 소멸자에서 '순수 가상 함수 호출' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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