2012-01-15 31 views
0

我難以理解這樣的:除了賦值運算符,C++中的哪些運算符不會被繼承?

衆所周知的是賦值運算符不會直接繼承了......我已經問過這個昨天LINK

AFAIK以下非虛擬運營商不會繼承,以及:

operator& //unary user defined 
operator* //unary user defined 

所有其他運營商將被繼承(糾正我,如果我錯了)

哪個虛擬運營商不會被繼承? (虛擬說明符有什麼區別?)

+5

所有成員函數都是繼承的,不管它們是否爲運算符重載。 'operator ='的特殊之處在於,無論是隱式聲明還是用戶聲明,它都將被派生類實現隱藏。如果你有其他理解,我想你可能誤解了關聯問題的答案。 – 2012-01-15 14:39:55

+0

請注意,大多數二元運算符('+',''''''',''''''''')應該是自由函數,而不是方法,因爲這將允許無法進行的轉換。 – 2012-01-15 14:46:09

+0

謝謝Charles和Anton! – codekiddy 2012-01-15 15:09:20

回答

4

嚴格地說,一切都是遺傳的。然而,以下將通過隱含聲明的形式隱藏在派生類(或用戶聲明的版本中,如果用戶聲明他們):

  • 默認構造方法:T()
  • 析構函數:~T()
  • 複製構造:T(T const &)(有時沒有const
  • 拷貝賦值運算符:T & operator=(T const &)(有時沒有const
  • 移動構造函數:T(T &&)
  • 布展賦值運算符:T & operator=(T &&)

operator&operator*繼承和其他事物一樣。 virtual聲明沒有區別。

+0

謝謝。如果我明白:隱藏的意志也將是:assigment operator,move assigment,move copy ctor。那是對的嗎? – codekiddy 2012-01-15 15:01:51

+0

@codekiddy:是的,當你評論時我只是添加它們(我的C++ 11知識有點粗略,所以我必須仔細查看它)。 – 2012-01-15 15:09:24

0

虛擬關鍵字應用於方法時,意味着子類可以選擇是否覆蓋它們。如果他們不這樣做,超類的行爲將在子類上調用該方法時執行。

如果虛擬方法是純粹的,那麼需要子類來覆蓋它。沒有默認行爲,他們可以依靠。

+0

「通過超類指針或引用*在子類」 - *上調用該方法時「。 – 2012-01-15 14:42:26

4

分配運算符由Derived類繼承,但派生運算符的派生類版本hides基類版本。

所有其他操作員的情況也是如此。

+0

那麼如果規則很簡單,那就OK:D謝謝! – codekiddy 2012-01-15 15:08:45

0

我已閱讀書在C++的思考,在第14章下面的行中提到

除了賦值運算符,運營商自動 繼承到派生類。