假设我有两个班级
Widget
^
|
Window
我有另一个类应用程序:
定义如下
class Application
{
public:
...
private:
friend Widget;
};
这不会授予Window受保护和私有成员的访问权限。有没有办法在不声明Window和任何后续“Widget”作为Application的朋友的情况下完成此任务?
答案 0 :(得分:4)
不,不可能。
friend
发货不可继承。
此外,friend
船表示两个实体之间有意的强耦合因此,如果您的设计确实要求如此强大的耦合继续并使它们成为friend
s。 friend
突破封装是一个太被误解的概念。
答案 1 :(得分:3)
在基类中定义一些方法来转发对Application的调用吗?
例如
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();
}
};
答案 2 :(得分:0)
如果继承的方法是唯一需要访问app类的方法,那么你可以将各个方法声明为朋友,只要窗口类没有覆盖它们,他们就可以使用这些方法和朋友访问。