ограничение на функцию друга - PullRequest
4 голосов
/ 20 июля 2011

Согласно тексту, который я имею в виду ( Полная ссылка Герберта Шильдта), производный класс не наследует функции-друзья, а функции-друзья могут не иметь спецификатор класса хранения. То есть они не могут быть объявлены как статические или внешние. Почему?

Ответы [ 2 ]

8 голосов
/ 20 июля 2011

производный класс не наследует функции друга? […] Почему?

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

они не могут быть объявлены как статические или внешние, почему?

Поскольку static не имеет смысла (это имеет смысл только в функциях, принадлежащих классу, а friend s являются свободными функциями), а extern снова нарушит инкапсуляцию, потому что класс не может эффективно больше не контролируйте, какая функция имеет к ней доступ: из-за того, что он является extern, друг может фактически прибыть из другого модуля компиляции, неизвестного классу.

См. Ответ Яна для исправления.

5 голосов
/ 20 июля 2011
  1. Унаследованный класс не наследует зажаренные функции, потому что в этом есть смысл:
    1. Функция друга сама знает о классе, чей это друг, но волшебным образом не узнает оновый подкласс, поэтому ему не нужно быть его другом.
    2. Все еще возможно использовать функцию в производном классе из-за неявного преобразования в parent.
  2. Объявление друга не может содержать ни static, ни extern, поскольку оно не является частью сигнатуры функции, поэтому указывать функцию не нужно.Я считаю, что объявление самой функции может (вне класса) содержать либо.
...