파생 클래스의 복사 생성자를 정의하려면 기본 클래스의 기본 생성자를 정의해야하는 이유는 무엇입니까?

메가 모늄

단일 cpp 파일에 다음 코드가 있습니다.

class Base
{
  public:
    //constructor
    Base() = delete;
};

class Derived : public Base
{
  public:
    //copy constructor
    Derived( const Derived & other ){};
};

int main( int argc, char* argv[] )
{
  //empty
}

그러나 cpp 파일을 컴파일하면 오류가 발생합니다.

exp.cpp : In copy constructor 'Derived :: Derived (const Derived &)':
exp.cpp : 15 : 37 : error : use of deleted function 'Base :: Base ()'
Derived (const Derived & other) {};

exp.cpp : 7 : 5 : 참고 : 여기에 선언 됨
Base () = 삭제;
^ ~~~

이유를 모르겠습니다. 파생 클래스에 대한 복사 생성자를 정의 할 때 기본 클래스 기본 생성자가 어떻게 작동합니까?

Jean-Baptiste Yunès

파생 클래스의 개체를 생성하려면 기본 클래스의 개체를 생성해야합니다 (파생 인스턴스는 기본 인스턴스 + 확장이므로).

따라서 파생 인스턴스를 초기화하려면 기본 인스턴스를 초기화해야합니다. 질문은 파생 클래스에 대한 ctor를 호출 할 때 기본 클래스의 어떤 ctor가 호출됩니까? 파생 된 ctor를 다음과 같이 정의했습니다.

Derived( const Derived & other ){};

컴파일러는 특정 기본 클래스 ctor에 대한 호출을 지정하지 않은 것을 관찰 한 다음 매개 변수없이 ctor에 대한 호출을 생성합니다. 그러나 아아, 기본 클래스에서 삭제했습니다. 그런 다음 오류가 발생합니다.

파생 클래스에 대해 복사 ctor를 호출하면 삭제되지 않은 기본 클래스의 복사 ctor에 대한 호출이 생성된다고 생각할 수 있습니다. 그러나 아아, 아닙니다. 규칙은 기본 클래스에 대해 특정 ctor 호출을 지정하지 않으면 매개 변수가없는 ctor가 호출된다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관