2011-09-10 292 views
27

一個子類是否繼承,主類的朋友關聯(主類和其他類都與主類有聯繫)?C++的朋友繼承?

或者換一種說法,繼承如何應用於friend關鍵字?

擴大: 如果不是,有什麼辦法繼承友誼嗎?

我跟了喬恩的建議,發佈了設計問題:
C++ class design questions

+3

如果您的設計需要繼承友誼,它很好地表明您的設計需要改變。 –

+0

這個功能的用例是什麼?根據你真正想要完成的事情,可能會有其他的選擇,而不是讓所有的課程變得如此友好 –

+0

@David:我將包含一個描述情況的問題的鏈接。 – SSight3

回答

35

友誼是不是在C++繼承。

的標準說(ISO/IEC 14882:2003,部分11.4.8):

友誼既不繼承也不傳遞的。

+0

有沒有辦法讓它繼承? – SSight3

+2

@ SSight3:不,您需要明確地在層次結構中創建所有類(可能需要源代碼預處理器的幫助)。如果您有特定的問題需要解決,請明確詢問。 – Jon

+0

聽起來像一個很好的建議。 – SSight3

2

答案很簡單:沒有,子類不繼承的朋友關聯。朋友只能訪問該協會聲明的班級的私人成員,而不能訪問該班級的父母和/或孩子的私人成員。雖然您可能是訪問受保護的超類成員,但我不確定這一點。

+2

Derived類可以隨時訪問Base類的受保護成員,它通過** Inheritance **而不是** Friend **發送。 –

+0

@Als:一個派生類可以隨時訪問基類的受保護成員。不,實際上取決於。取決於繼承的種類! – Nawaz

+0

@Nawaz:不是真的! [什麼是訪問說明符,我應該繼承私有保護或公共](http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-inherit-with-private-protected-or-public /%5d)應該是一個很好的解讀。 –

6

您可以在父項中創建(靜態)受保護的方法,這將允許您執行類似的操作。

class MyFreind 
{ 
private: 
    int m_member; 
    friend class Father; 
}; 

class Father 
{ 
protected: 
    static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; } 
}; 

class Son : public Father 
{ 
public: 
    void doSomething(MyFriend& io_freind) 
    { 
     int& friendMember = getMyFreindMember(io_freind); 
     // .... 
    } //() 
}; 

然而,這繞過封裝,所以你可能應該再看看你的設計。

+0

這似乎更適用於其他鏈接的問題。良好的反應。我正在考慮重新設計。 – SSight3