2012-02-18 96 views
4

成爲朋友可以說我有兩個班通過繼承C++

Widget 
^
    | 
Window 

,我有另一個類應用:

定義如下

class Application 
{ 
public: 
    ... 
private: 
    friend Widget; 
}; 

這不會給窗口訪問應用程序受保護和私人成員有沒有辦法做到這一點,而不聲明窗口和任何後續的「小工具」作爲應用程序的朋友?

+0

[C++中的朋友範圍]的可能重複(http://stackoverflow.com/questions/437250/friend-scope-in​​-c) – Mat 2012-02-18 17:35:04

回答

4

不,這是不可能的。

friend船是不可繼承的。

另外,friend船表明兩個實體之間有意的強耦合因此,如果您的設計確實需要如此強大的耦合繼續,並使它們成爲friend s。拆船封裝是一個太過於誤解的概念。

3

會在基類中定義一些方法來將調用轉發給應用程序來完成這項工作嗎?

例如,

class Application 
{ 
public: 
    ... 
private: 
    friend Widget; 
    void PrivateMethod1(); 
}; 

class Widget 
{ 
protected: 
    void ApplicationPrivateMethod1() { /* forward call to application.PrivateMethod1(); */ } 
}; 

class Window : Widget 
{ 
    void SomeMethod() 
    { 
     // Access a friend method through the forwarding method in the base Widget class 
     ApplicationPrivateMethod1(); 
    } 
}; 
0

如果繼承的方法是需要的應用程序級的訪問比你可以聲明單個方法的朋友,只要在窗口類沒有覆蓋他們,他們可以利用與朋友訪問這些方法唯一的。