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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-15 07:12:02382검색

Why Do I Get

치명적인 "순수 가상 함수 호출" 오류: 뿌리 풀기

"순수 가상 함수 사용 시 프로그램 충돌이 발생하면 당황스러울 수 있습니다. 호출" 오류는 특히 영향을 받은 클래스가 추상 클래스이므로 개체 생성을 금지해야 하는 경우에 발생합니다. 이 글의 목적은 이러한 오류의 근본 원인을 밝히고 포괄적인 설명을 제공하는 것입니다.

추상 클래스의 가상 함수 호출

가상 함수를 사용하면 파생 클래스를 재정의할 수 있습니다. 기본 클래스 구현을 통해 다형성을 가능하게 합니다. 그러나 추상 클래스에서 "순수 가상 함수"로 지정된 특정 함수는 기본 클래스에 구현되어 있지 않습니다. 대신, 모든 파생 클래스가 자체 구현을 제공하도록 요구하는 자리 표시자 역할을 합니다. 하나 이상의 순수 가상 함수가 없는 추상 클래스는 인스턴스화될 수 있지만 순수 가상 함수를 호출하면 런타임 오류가 발생합니다.

"순수 가상 함수 호출" 충돌

그러나 생성자나 소멸자 내에서 가상 함수 호출을 시도하면 예상치 못한 시나리오가 발생할 수 있습니다. 객체 생성 및 소멸의 제약으로 인해 이 단계에서는 가상 함수 호출이 허용되지 않습니다. 결과적으로 가상 함수의 기본 클래스 버전이 대신 호출됩니다. 이는 순수 가상 함수의 경우 존재하지 않아 런타임 충돌을 유발합니다.

예시 그림

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

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

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

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}

이 예에서는 가상 함수를 호출하려는 시도가 있습니다. 추상 기본 클래스(Base)의 생성자에서 (doIt())을 호출하면 파생 클래스 객체(d)가 생성될 때 "순수 가상 함수 호출" 오류가 발생합니다. Base에 doIt()에 대한 구현이 없기 때문에 호출은 유효하지 않은 순수 가상 함수 자리 표시자로 전달됩니다.

결론

"순수 가상 함수 호출" 오류는 생성자나 소멸자에서 실수로 가상 함수 호출이 이루어질 때 발생합니다. 이러한 충돌을 방지하고 추상 클래스가 올바르게 작동하도록 하려면 이러한 제한 사항을 이해하는 것이 중요합니다. 더 많은 통찰력을 얻으려면 해당 주제에 대한 Raymond Chen의 계몽적인 기사를 참조하세요.

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

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