Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

public:

 X::f; // makes X::f and X::f(int) public in Y

};

Нельзя в производном классе установить доступ к члену базового класса, если в производном классе определен член с этим же именем, например:

class X {

public:

 void f;

};

class Y: private X {

public:

 void f(int);

 X::f; //
ошибка: два описания f

};

R.11.4 Друзья

Другом класса называется функция, которая не является членом класса, но в которой можно использовать частные и защищенные члены этого класса. Имя друга не принадлежит области видимости класса, и дружественная функция не вызывается с помощью операций доступа к членам (§R.5.2.4), если только она не является членом другого класса. Следующий пример показывает различие между членами и друзьями:

class X {

 int a;

 friend void friend_set(X*, int);

public:

 void member_set(int);

};

void friend_set(X* p, int i) {p-›a = i;}

void X::member_set(int i) {a = i;}

void f

{

 X obj;

 friend_set(&obj,10);

 obj.member_set(10);

}

Если в описании friend использовано имя перегруженной функции или операции, только функция, однозначно определяемая типами формальных параметров, становится другом. Функция-член класса X может быть другом класса Y, например:

class Y {

 friend char* X::foo(int);

 //…

};

Можно объявить все функции класса X друзьями класса Y с помощью спецификации-сложного-типа (§R.9.1):

class Y {

 friend class X;

 //…

};

Описание одного класса как друг другого класса дополнительно подразумевает, что частные и защищенные члены класса, предлагающего дружбу, могут использоваться в классе, получающем ее, например:

class X {

 enum { a=100 };

 friend class Y;

};

class Y {

 int v[X::a]; // Y друг класса X

};

class Z {

 int v[X::a]; // ошибка: X::a недоступно

};

Если класс или функция, объявленные как друзья, не были описаны, их имена попадают в ту же область видимости, что и имя класса, содержащего описание friend (§R.9.1).

Функция, появившаяся первый раз в описании friend, считается эквивалентной функции, описанной как extern (§R.3.3, §R.7.1.1).

Если функция-друг определена в описании класса, она считается функцией со спецификацией inline и к ней применимо правило переноса определения

функции для функций-членов (§R.9.3.2). Функция-друг, определенная в описании класса, относится на лексическом уровне к области видимости этого класса. Для функции-друга, определенной вне класса, это не так.

На описание friend не влияет указание спецификаций-доступа (§R.9.2).

Понятие дружбы не является ни наследуемым, ни транзитивным.

Подтвердим это примером:

class A {

 friend class B;

 int a;

};

class B {

 friend class C;

};

class C {

 void f(A* p);

 {

p-›a++; // ошибка: C не друг класса A, хотя

// является другом друга класса A

 }

};

class D: public B {

 void f(A* p)

 {

p-›a++; // ошибка: D не друг класса A, хотя

// является производным друга класса A

 }

};

R.11.5 Доступ к защищенным членам

Друг или функция-член производного класса имеет доступ к защищенному статическому члену базового класса. Друг или функция-член производного класса могут получить доступ к защищенному нестатическому члену одного из своих базовых классов только через указатель, ссылку или объект производного класса (или любого класса, являющегося производным по отношению к нему). Рассмотрим пример:

class B {

protected:

 int i;

};

class D1: public B {

};

class D2: public B {

 friend void fr(B*, D1*, D2*);

 void mem(B*, D1*);

};

void fr(B* pb, D1* p1, D2* p2)

{

 pb-›i = 1; // недопустимо

 p1-›i = 2; // недопустимо

 p2-›i = 3; // нормально (обращение через D2)

}

void D2::mem(B* pb, D1* p1)

{

 pb-›i = 1; // недопустимо

 p1-›i = 2; // недопустимо

 i = 3; // нормально (обращение через this)

}

void g(B* pb, D1* p1, D2* p2)

{

 pb-›i = 1; // недопустимо

 p1-›i = 2; // недопустимо

Поделиться:
Популярные книги

Live-rpg. эволюция-3

Кронос Александр
3. Эволюция. Live-RPG
Фантастика:
боевая фантастика
6.59
рейтинг книги
Live-rpg. эволюция-3

Я – Орк

Лисицин Евгений
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я – Орк

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Курсант: Назад в СССР 11

Дамиров Рафаэль
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 11

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Восход. Солнцев. Книга XI

Скабер Артемий
11. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга XI

Мимик нового Мира 4

Северный Лис
3. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 4