2011-07-20 50 views
4

根據我所提到的文本(Herbert Schildt的完整參考文獻),派生類不會繼承好友函數,並且好友函數可能沒有 存儲類說明符。也就是說,它們可能不會被聲明爲靜態或外部。爲什麼?對朋友功能的限制

+0

把書扔掉,買一個新的。 Herb Schildt的書因爲技術上的不準確而被[普遍誹謗](http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html#SchildtAny)。 –

回答

8

派生類不會繼承好友函數嗎? [...]爲什麼?

因爲這會破壞封裝:派生類無法再控制其朋友,所以它無法控制誰有權訪問其內部。

它們可能不會被聲明爲static或extern,爲什麼?

因爲static將毫無意義(它纔有意義上屬於一類的功能,friend s爲無功能),以及extern將再次破壞封裝,因爲該類有效不能控制不再哪些功能有權訪問它:由於是extern,朋友可以有效地來自不同的編輯部門,這是該班級不知道的。

請參閱Jan的更正答案。

+2

對不起,這個答案的第二部分是完全錯誤的。 'static'對於自由函數是有意義的(使它們在編譯單元中是本地的),並且不包含關鍵字'static'的每個自由函數聲明隱含地包含'extern'。此外,類不與編譯單元相關聯。朋友可以有效地來自*任何*編輯單元,不管它是不同的,都不能被定義。 –

+0

@Jan你是對的。 –

5
  1. 繼承類沒有繼承炒功能,因爲在做這一點:
    1. 友元函數本身知道其朋友是類,但它不會神奇地瞭解一個新的子類,所以它不需要成爲它的朋友。
    2. 由於隱式轉換爲父類,所以仍然可以在派生類上使用該函數。
  2. 朋友聲明不能包含staticextern,因爲它不是函數簽名的一部分,所以不需要指定函數。我相信函數本身的聲明可以(在類的外面)包含。