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

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

DDD
DDD원래의
2024-11-11 17:28:02561검색

Why Do

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

"순수 가상 함수 호출"이라는 비밀스러운 오류 메시지가 표시되면 사용자는 추상 클래스의 객체를 인스턴스화할 수 없음에도 불구하고 프로그램이 어떻게 컴파일을 관리하는지 궁금합니다. 이 문제는 생성자 또는 소멸자 내에서 가상 함수를 호출하려는 시도로 인해 발생합니다.

컴파일러의 딜레마:

객체 생성 중에 생성자는 객체의 상태를 초기화하는 역할을 담당합니다. 반대로 소멸자는 객체 소멸을 처리합니다. 그러나 파생 클래스 객체가 불완전하거나 존재하지 않기 때문에 이 단계에서는 가상 함수 호출을 수행할 수 없습니다.

이러한 경우 컴파일러는 가상 함수의 기본 클래스 버전을 호출합니다. 그러나 순수 가상 함수는 기본 클래스에 구현이 부족하기 때문에 이로 인해 악명 높은 "순수 가상 함수 호출" 오류가 발생합니다.

설명할 코드 조각:

다음 C 예제를 고려하십시오.

class Base {
public:
    Base() {
        reallyDoIt(); // INCORRECT, doesn't work
    }
    void reallyDoIt() { doIt(); } // INCORRECT, doesn't work
    virtual void doIt() = 0; // Pure virtual function
};

class Derived : public Base {
    void doIt() {} // Overrides pure virtual function
};

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

Derived 클래스를 인스턴스화할 때 프로그램은 호출을 시도합니다. reallyDoIt() 생성자에서 doIt()을 호출합니다. doIt()은 순수 가상 함수이므로 기본 클래스에 구현이 없으므로 치명적인 오류가 발생합니다.

결론:

"순수 가상"을 방지하려면 함수 호출"이 충돌하는 경우 생성자나 소멸자 내에서 가상 함수 호출을 피하는 것이 중요합니다. 이렇게 하면 객체 생성 및 소멸 중에 파생 클래스와 관련된 메서드만 호출되어 기본 클래스에서 정의되지 않은 함수가 호출되는 것을 방지할 수 있습니다.

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

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