Стать другом через Inheritance C++

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

Widget
  ^
  |
Window

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

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

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

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


person Matthew Hoggan    schedule 18.02.2012    source источник
comment
возможный дубликат области Friend в C++   -  person Mat    schedule 18.02.2012


Ответы (3)


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

friendship не передается по наследству.

Кроме того, friendship указывает на преднамеренную сильную связь между двумя объектами. Поэтому, если ваш дизайн действительно требует такой сильной связи, сделайте их friends. friendship, нарушающий инкапсуляцию, — это слишком неправильно понятая концепция.

person Alok Save    schedule 18.02.2012

Будет ли работать определение некоторых методов в базовом классе для переадресации вызовов в Application?

Eg.

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();
   }
};
person Scott Langham    schedule 18.02.2012

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

person realgenob    schedule 19.02.2012