Можно ли сочетать дружбу с наследством для доступа к личным данным членов? - PullRequest
1 голос
/ 23 ноября 2011

Давайте предположим, что я хочу, чтобы единственный класс Child и только этот класс наследовал от Father и предоставить Детям доступ к данным отцов. Кроме того, никто не должен наследовать от отца, чтобы добраться до его внутренних органов, поэтому я храню данные Отца в тайне

Редактировать: я выбрал защищенный, так как хочу, чтобы данные были скрыты. Некоторые люди отстаивают это как хорошую практику, но, возможно, это слишком догматично: (например, Херб Саттер в http://drdobbs.com/184403867) На самом деле класс следует продлить только один раз. Следовательно, запрет на наследование, как указал Стив Джессоп, был бы вариантом, но я думаю стоимость этого (виртуального и т. д.) заходит слишком далеко для того, что мне нужно.

Код будет выглядеть так:

class Father{
  friend class Child;
  public: 
    //functions
  private:
    int mData;
}

class Child: public Father{
  public:
    void changeData(int val){mData=val;}
}

У меня тут серьезные проблемы или это правильное решение, если исходить из того, что наследование было хорошим решением?

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

На самом деле это не мешает кому-либо еще использовать Father в качестве базового класса, оно просто запрещает им обращаться к mData, если они это делают.

Если это то, что вы хотите (Child имеет привилегиюдоступ к Father, которого нет у других классов, и тот факт, что Child также имеет базовый класс Father не имеет отношения), прекрасно.

Если вы дополнительно запрещаете кому-либо ещеиспользуя Father в качестве базового класса (либо с помощью только документации, либо с помощью трюка с виртуальным базовым классом), тогда использование friend становится немного бессмысленным.С тем же успехом вы можете просто сделать mData защищенным, а не частным, именно для этого и существует защита.

1 голос
/ 23 ноября 2011

protected: спецификатор доступа введен для той же цели.

Несмотря на то, что это предоставит членам доступ к всем Child из Father, эта конструкция более чистая и более удобная для обслуживания в долгосрочной перспективе.

0 голосов
/ 23 ноября 2011

, если Child - единственный класс, который должен наследовать Father, тогда вы можете объявить те члены и методы в Father, которые вы хотите перенести в Child (но вы все еще хотите сохранить секрет "от других классов) защищен вместо личного.

так же, как частный, защищенный не доступен снаружи.

в отличие от частного, защищенное наследуется.

...