通过继承C ++成为朋友

时间:2012-02-18 17:32:23

标签: c++ inheritance friend

假设我有两个班级

Widget
  ^
  |
Window

我有另一个类应用程序:

定义如下

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

这不会授予Window受保护和私有成员的访问权限。有没有办法在不声明Window和任何后续“Widget”作为Application的朋友的情况下完成此任务?

3 个答案:

答案 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类的方法,那么你可以将各个方法声明为朋友,只要窗口类没有覆盖它们,他们就可以使用这些方法和朋友访问。