단일 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 () = 삭제;
^ ~~~
이유를 모르겠습니다. 파생 클래스에 대한 복사 생성자를 정의 할 때 기본 클래스 기본 생성자가 어떻게 작동합니까?
파생 클래스의 개체를 생성하려면 기본 클래스의 개체를 생성해야합니다 (파생 인스턴스는 기본 인스턴스 + 확장이므로).
따라서 파생 인스턴스를 초기화하려면 기본 인스턴스를 초기화해야합니다. 질문은 파생 클래스에 대한 ctor를 호출 할 때 기본 클래스의 어떤 ctor가 호출됩니까? 파생 된 ctor를 다음과 같이 정의했습니다.
Derived( const Derived & other ){};
컴파일러는 특정 기본 클래스 ctor에 대한 호출을 지정하지 않은 것을 관찰 한 다음 매개 변수없이 ctor에 대한 호출을 생성합니다. 그러나 아아, 기본 클래스에서 삭제했습니다. 그런 다음 오류가 발생합니다.
파생 클래스에 대해 복사 ctor를 호출하면 삭제되지 않은 기본 클래스의 복사 ctor에 대한 호출이 생성된다고 생각할 수 있습니다. 그러나 아아, 아닙니다. 규칙은 기본 클래스에 대해 특정 ctor 호출을 지정하지 않으면 매개 변수가없는 ctor가 호출된다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다