В C++, дружба — это механизм, который даёт одному классу специальный доступ к приватным и защищённым членам другого класса. Но эта привилегия работает под тремя критическими ограничениями, которые предотвращают нежелательное расширение доступа.
Дружба не наследуется производными классами. Если класс Fred объявляет класс Base своим другом, производные классы Base не получают автоматический доступ к приватным членам Fred. Каждое отношение дружбы должно быть объявлено явно.
Пример:
class Fred {
friend class Base; // Только Base получает доступ
private:
int secret;
};
class Derived : public Base {
// НЕ имеет доступа к Fred::secret
};
Дружба не распространяется транзитивно через цепочки отношений. Если класс Fred объявляет Wilma своим другом, а Wilma объявляет Betty своим другом, это не делает Betty другом Fred.
Fred доверяет WilmaWilma доверяет BettyFred не доверяет Betty автоматическиДружба — это одностороннее отношение. Если класс Fred объявляет класс Wilma своим другом, объекты Wilma получают специальный доступ к приватным членам Fred, но объекты Fred не получают автоматический доступ к приватным членам Wilma.
class Fred {
friend class Wilma; // Даёт Wilma доступ к Fred
private:
int secretData;
};
// Fred всё равно не может обращаться к приватным членам Wilma
Эти три ограничения — намеренные меры безопасности. Они предотвращают неконтролируемое расширение доступа и сохраняют чёткие, явные границы инкапсуляции данных. Класс должен явно контролировать, каким другим классам разрешён доступ к его членам.
Если класс A является friend класса B, а класс B является friend класса C, то класс A автоматически получает доступ к private членам класса C.
Новый — ещё не проверен сообществом
Вы