2012-06-26 3 views
1
class A 
{ 
    int Avalue; 
    A& operator=(A& copyMe) 
    { 
     Avalue = copyMe.Avalue; 
     return *this; 
    } 
} 

class B:public A 
{ 
    int Bvalue; 
    B& operator=(B& copyMe) 
    { 
     Bvalue = copyMe.Bvalue 
     return *this; 
    } 
} 

B의 대입 연산자에서 A 또는 기본 클래스 대입 연산자를 호출하는 방법? 대입 연산자 호출에서 A의 반환 참조를 처리하는 방법.상속 클래스에서 대입 연산자를 재정의하십시오.

답변

2

모든 사업자는 똑똑한 기능의 약간으로 생각하지만, 그 추론 똑똑 컴파일러의 단지 의례의 할 수있는 주어진 피연산자가 있으며 재정의 (override)로 전달합니다. 그것은 의미가있는 상황에서 멋진 구문 설탕을 추가하는 훌륭한 확장 가능한 방법이지만 일반적인 사용법 때문에 사람들은 이것이 유효하다는 것을 실제로 볼 수는 없지만 재정의 정의를 관찰 할 때 함수처럼 보이고 기능. 따라서 범위 연산자 ::을 사용하여 A 인터페이스의 공용 부분에 액세스하면됩니다.

A::operator=(copyMe) 

private 액세스, 당신은 또한 여러 세미콜론 누락하고있는 클래스의 기본주의 마십시오. A & 연산자 = (:, 다양한 이유로 CONST 및 인수로을하는 것이 좋습니다, 일반적으로 또한

class A 
{ 
    private: 
    int Avalue; 
    public: 
    A& operator=(A& copyMe) 
    { 
     Avalue = copyMe.Avalue; 
     return *this; 
    } 
} 
+0

: A의 복사 할당 연산자에 액세스하려면, 당신은 공개로 지정해야 const A & copyMe) B & operator = (const B & copyMe) – Rollie

+0

실제로 변경되지 않는 무언가를 전달할 때마다 const가되도록 상처를 입히지 않습니다. 멤버 메소드에도 적용됩니다. 아무것도 변경하지 않으면 const로 만듭니다. 그것은 신경과 시간을 절약합니다. 또한, 나는 그것에 일찍 들어가는 것이 좋습니다. 코드가 수행해야하는 작업과 수행해서는 안되는 작업에 대해 더 많이 생각하기 시작합니다. –

+0

더 중요한 점은 복사 생성자를 쓰지 않고도 복사 할당 연산자를 작성하는 것은 거의 불가능합니다. 이 경우 기본 복사 생성자가 괜찮기 때문에 이탈하지 않을 것이지만 기본 할당 연산자도 마찬가지이므로 어느 것도 정의 할 필요가 없습니다. (또한이 클래스의 경우 copyMe를 할당 op 대신 참조로 전달합니다. 컴파일러가 최적화하는 것이 더 쉽고 사실 더 쉽습니다. 한 쌍의 정수는 중요하지 않습니다.) – abarnert

0

파생 된 op에 A::operator=(copyMe)을 추가하기 만하면됩니다. 또한 복사본은 비 const 참조이어야합니다.

관련 문제