2013-10-10 6 views
0

다른 클래스 (클래스 B)를 상속하는 클래스 (클래스 A)가 있습니다.파생 클래스의 복사 및 할당 연산자

class A: public B 

(복사본을 허용하지 않기 때문에) 클래스 B는 복사 생성자와 할당 연산자를 사용할 수 없습니다.

private: 
B(const B&); 
B& operator=(const B&); 

내 질문은 그게 내가 또한 비활성화 사본뿐만 아니라 파생 클래스에서 구성 및 할당 연산자한다 또는 나는 모두를 정의하지 않은 경우는 괜찮습니다.

+0

* 어떻게 * B가 copy-ctor를 사용하지 않았습니까? – jrok

+0

@jrok 왜? B가 복사 및 할당을 어떻게 비활성화했는지에 관계없이 파생 클래스에서 기본적으로 비활성화되어 있습니다. –

+0

@JamesKanze '보호 된'섹션에 '사용 중지'함을 넣겠습니다. – jrok

답변

1

질문은 오히려 다시 사용하도록 설정해야합니다. 베이스 또는 멤버가 복사 불가능한 경우 클래스는 기본적으로 복사 불가능합니다. 일반적으로 합리적인 의미를 부여하는 것은 어렵거나 불가능하기 때문에 제거하지 않으려합니다. 그러나 주목할만한 예외가 있습니다. 예를 들어 기본 클래스가 추상 클래스 인 경우 복제를 지원하기 위해 파생 클래스에서 복사 생성자를 사용할 수 있지만 할당은 사용할 수 없습니다.

+0

파생 클래스에 포인터 변수가있는 경우 복사 생성자와 대입 연산자를 정의해야한다는 경고가 나타납니다. 다른 솔루션 (포인터가없는)을 고려해야합니까? 파생 클래스에서 정의하고 사용하지 않도록 설정하면 괜찮습니까? –

+0

@AvbAvb 복사 및 할당이 기본 클래스에서 비활성화되어 있고 다시 활성화되지 않은 경우 경고가 잘못된 것입니다. 나는 그것을 끄고 (아마도 컴파일러 벤더에게 불평 할 것이다). –

3

하위 클래스는 상위 클래스보다 동일하거나 더 엄격한 [전제 조건, 사후 조건 및 불변 값]을 가져야합니다. 이것은 Liskov Substitution Principle입니다. 따라서 기본 클래스의 계약을 느슨하게 할 것이므로 파생 클래스에서 복사 생성 등을 다시 활성화하면 안됩니다.

당신이 그것을 할 필요가 있거나 정말로 그것을하고 싶다면 당신은 당신의 디자인을 다시 생각해야한다는 신호 일 수 있습니다.

+0

다시 사용하지 않으려합니다. 파생 된 클래스에서 해당 클래스를 사용하지 않도록 설정해야하는지 또는 파생 클래스에서 아무 것도하지 않으면 괜찮은지 여부를 묻는 것입니다. –

+0

미안하지만, 당신은 이미 기본 동작이 파생 클래스가 복사 생성 및 할당 측면에서 기본 클래스의 계약을 "상속"한다는 것을 이미 알고 있다고 가정했습니다. 예를 들어 명시 적으로 귀하의 의도를 명시하면 분명했을 것입니다. "Derived는 Base와 동일한 제한을두고 싶습니다. Base에서 무엇을합니까?","Nothing "이라고 대답 할 것이다. –

0

복사 생성자와 기본 클래스의 할당 연산자를 불허하는 것은 파생 클래스의 복사 생성자와 대입 연산자뿐만 아니라 사용할 수 없음을 발생합니다 :

class B { 
public: 
    B() { } 
private: 
    B(const B&); 
    B& operator=(const B&); 
}; 

class A : public B { }; 

을 필요하지 않은이 경우 디폴트의 ​​구현은 부모의 구현을 먼저 사용해야하기 때문에 파생 클래스에 대해 명시 적으로이를 허용하지 않습니다. 따라서 코드에서 액세스하려고 시도하지 않으면 :

int main() { 
    A a; 
} 

완전히 유효합니다. 그러나 당신은 복사하려고하면 :

int main() { 
    A a; 
    A a2 = A(a); 
} 

컴파일러는 클래스 A은 (그러나 의미 적으로 두 번째 시나리오는 발생해서는 안) B의 private 멤버에 액세스하려고에 대해 불평 할 것이다.

관련 문제