2012-06-26 53 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

所有運營商可以被認爲是一個有點聰明的功能,但是這只是禮貌的編譯器,它足夠聰明來推斷什麼是給定的操作數,並將它們傳遞到您的覆蓋。這是一種很好的擴展方式,可以在有意義的情況下添加好的語法糖,但由於它們通常的用法,人們無法真正看到這是有效的,但是當您觀察覆蓋的定義時,它們看起來像函數,功能。因此,只需使用範圍操作員::即可訪問A界面的公共部分。

A::operator=(copyMe) 

請注意,您缺少幾個分號,並且類默認爲private訪問。要訪問A中的拷貝賦值運算符,你需要指定它爲公衆:

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

此外,它總體上是好的做法,採取一個const&作爲參數,以各種理由: A&運算符=( const A&copyMe) B&operator =(const B&copyMe) – Rollie

+0

事實上,每當你傳入一些不會改變的東西時,真正的使它成爲const是不會傷害的。也適用於成員方法,如果它不應該改變任何東西,使它成爲const。它節省了神經和時間。另外,我建議儘早進入。你開始更多地考慮你的代碼應該做什麼,不應該做什麼。 – 2012-06-26 04:55:47

+0

更重要的是,寫一個複製賦值操作符而不寫一個拷貝構造函數幾乎不是一個好主意。在這種情況下,你會擺脫它,因爲默認的拷貝構造函數很好 - 但是默認的賦值運算符也是如此,所以你不需要定義這個。 (另外,對於這個類,我會通過值來傳遞copyMe,而不是通過引用賦值操作。它更簡單,實際上編譯器更容易優化 - 而不是對於一對int整數來說很重要。) – abarnert

0

您只需要在派生操作中添加A::operator=(copyMe)即可。此外,副本應爲非常量參考。