2012-02-18 98 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

如果继承的方法是需要的应用程序级的访问比你可以声明单个方法的朋友,只要在窗口类没有覆盖他们,他们可以利用与朋友访问这些方法唯一的。