2011-12-08 51 views
6

如何使用賦值操作符實現設置基類成員?如果例如某人限定在派生類這樣賦值操作符:當班級是孩子時重載賦值操作符

(其中兩個colourColour()是基類的成員 - 意味着線以下所示是非法的)

Derived& Derived::operator=(const Derived& rhs) 
{ 
if (&rhs != this) 
{ 

    Colour(rhs.colour); // not allowed 
     Colour(rhs.Colour()); // not allowed 
} 
return *this; 
} 

什麼解?有沒有在基地連接運營商重載的方法?難道我這樣做......

Derived& Derived::operator=(const Derived& rhs) : Base::operator=(rhs) 
...? 

回答

3

你接近,只是把方法體中這一呼籲。

if (&rhs != this) 
{ 
    Base::operator=(rhs); 
    // ... 
1

您應該能夠使用公共存取函數:

Derived& Derived::operator=(const Derived& rhs) 
{ 
    if (&rhs != this) 
     SetColour(rhs.GetColour()); 
    return *this; 
} 

以其他方式在基類保護的成員,使派生類訪問:

Derived& Derived::operator=(const Derived& rhs) 
{ 
    if (&rhs != this) 
     colour = rhs.colour; 
    return *this; 
} 

第三個選擇可能是在基類中定義一個賦值運算符公衆和你的派生類中調用基操作:

Derived& Derived::operator=(const Derived& rhs) 
{ 
    if (&rhs != this) 
     Base::operator=(rhs); 
    return *this; 
} 

下面是一個完整的測試用例:

#define TEST 2 
class Base 
{ 
public: 
    Base() : m_protected(0), m_private(0) {} 
    Base(int pro, int pri) : m_protected(pro), m_private(pri) {} 
    ~Base() {} 

#if TEST == 1 
    Base& operator=(const Base& rhs) 
    { 
     if (this != &rhs) 
     { 
      m_protected = rhs.m_protected; 
      m_private = rhs.m_private; 
     } 

     return *this; 
    } 
#elif TEST == 2 
    void SetPrivate(int i) { m_private = i; } 
    int GetPrivate() const { return m_private; } 
#endif 

protected: 
    int m_protected; 
private: 
    int m_private; 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base() {} 
    Derived(int pro, int pri) : Base(pro, pri) {} 
#if TEST == 1 
    Derived& operator=(const Derived& rhs) 
    { 
     Base::operator=(rhs); 
     return *this; 
    } 
#elif TEST == 2 
    Derived& operator=(const Derived& rhs) 
    { 
     if (this != &rhs) 
     { 
      SetPrivate(rhs.GetPrivate()); 
      m_protected = rhs.m_protected; 
     } 
     return *this; 
    } 
#endif 
}; 

int main() 
{ 
    Derived a; 
    Derived b(10, 5); 

    a = b; 
     return 0; 
} 
+0

你確定嗎?我的編譯器不允許我從基類,公共或其他地方訪問任何東西。 – SirYakalot

+0

它表示沒有重載參數的實例匹配(這不是真的)並且還說對象具有阻止匹配的類型限定符。那是什麼意思? – SirYakalot

+0

所有這些工作如果您使用公共繼承和非const方法。你能否展示更多的類定義和用法? – AJG85

1

我實現運算符=功能分配/構造在基類運營商的顏色,如果你要撥打的基地運營=從派生類使用:

Base::operator=(rhs) 
在派生類中操作

= ()實現。就我所知,您爲Derived operator =提出的簽名是無效的C++。

6

它是這樣完成的:

class B 
{ 
public: 
    B& operator=(const B & other) 
    { 
    v = other.v; 
    return *this; 
    } 
    int v; 
}; 

class D : public B 
{ 
public: 
    D& operator=(const D & other) 
    { 
    B::operator=(other); 
    return *this; 
    } 
};