2011-04-24 83 views
0

這是從有效C++第二版斯科特邁爾斯(第70頁)呼叫操作員的衍生自

作者寫道沒有太多的解釋是,當基類操作者=被稱爲以如下方式

的項目16內=
Base::operator=(rhs); 

一些編譯器(儘管不正確地)拒絕此,如果是由編譯器產生的operator =(見項目45),以便更好地利用

static_cast<base&>(*this) = rhs; 

在第45項他提到,如果基類operator =是私有的,派生類=無權調用它。

,但原來的問題編譯器拒絕它,因爲它是由編譯器生成的(這必須是公共的)

任何幫助(鏈接)這將是有益的。 (其很難谷歌這些類型的問題)

+2

幫助什麼,到底是什麼?這本書似乎非常明確和直接。你有什麼問題? – abelenky 2011-04-24 18:13:55

+0

如果您正在處理類層次結構,最好不要使用賦值。 – 2011-04-24 18:46:20

+0

@chris感謝您的編輯。 – Amar 2011-04-26 06:16:51

回答

3

但原來的問題編譯器 拒絕它,因爲它產生由編譯器 (這必須是公共的)

也許我明白了什麼你要。

編譯器生成的賦值運算符變爲公共。但第16項不是關於訪問級別。這是static_cast<base&>(*this)是破解編譯器的解決方法。在第16項中,Scott Meyers說當編譯器生成基類賦值操作符時可能需要解決方法。順便說一句,自第二版發佈以來,發生了很大的變化。第3版不再提及解決方法。

關於私人指派操作員。第45項說,如果基類賦值運算符是私有的,那麼編譯器不能爲派生類生成賦值運算符,因爲編譯器生成的賦值運算符依賴於基類賦值運算符。在這種情況下,您必須手動爲派生類編寫賦值運算符,或者不使用賦值運算符而離開派生類。

+0

看起來像static_cast (* this)只是一個破解編譯器的解決方法。它與公共/私人=運營商無關。關於引用第45項中的第16項,書是錯誤的,反之亦然。 – Amar 2011-04-26 06:14:58