Стать другом через Inheritance C ++ - PullRequest
4 голосов
/ 18 февраля 2012

Допустим, у меня есть два класса

Widget
  ^
  |
Window

и у меня есть еще одно приложение класса:

Определяется следующим образом

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

Это не даст Window доступ к защищенным приложениям и частным пользователям. Есть ли способ сделать это, не объявляя Window и любой последующий «виджет» в качестве друга приложения?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2012

Нет, это невозможно.

friend Корабль не наследуется.

Кроме того, friend ship указывает на намеренную сильную связь между двумя объектами. Так что, если ваш проект действительно требует такой сильной связи, сделайте их friend s. friend инкапсуляция, разрушающая судно, является слишком неправильно понятой концепцией.

3 голосов
/ 18 февраля 2012

Будет ли определение некоторых методов в базовом классе для переадресации вызовов в 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();
   }
};
0 голосов
/ 19 февраля 2012

Если унаследованные методы являются единственными, которым необходим доступ к классу приложения, вы можете объявить отдельные методы как друзья и, пока класс окна не переопределит их, они могут использовать эти методы с доступом к друзьям.

...