Объектно-ориентированный язык программирования С++ в примерах. Сивохин А.В. - 21 стр.

UptoLike

Составители: 

Из табл. 2 видно,что в отношении производных типов специ-
фикатор доступа члена базового типа определяет лишь потенци-
альный статус этого члена.Его фактический статус в производном
типе зависит от спецификатора доступа типа,указываемого в за-
головке производного типа,и определяется следующим образом.Ес-
ли тип объявляется базовым для некоторого другого со специфи-
катором типа public,то личные члены базового типа становятся
личными членами производного типа,а защищенные члены базового
типа - защищенными членами производного типа.Если же тип объ-
является для некоторого другого типа базовым со спецификатором
доступа private,то личные и защищенные члены базового типа
становятся личными членами производного типа.
Расмотренная система разграничения доступа к членам сос-
тавных типов легко может быть нарушена путем включения в оп-
ределение этого типа нового члена,являющегося описанием(или
даже определением) некоторой внешней функции с ключевым сло-
вом friend(друг).Функция-друг не имеет никаких особенностей,
помимо права доступа к любой,в том числе закрытой части
типа.В частности,функция-друг не имеет указателя this(если
только она не является полноправным членом типа).Описание
функции-друга вводит имя функции в самой внешней области ви-
димости программы и сопоставляется с другими описаниями или
определением этого имени.Описание друга может располагаться
или в закрытой,или в открытой части описания класса:где имен-
но,значения не имеет.
Необходимость использования таких функций определяется
тем,что в языке С++ одна и та же функция не может быть од-
новременно членом двух и более классов,как это требуется,на-
пример,в следующем варианте умножения классов вектор и мат-
рица:
class matrix;/*-предварительное описание класса матрицы; */
class vector /*-определение класса вектор: */
{ float v[4];
float operator[](int i) { return v[i]; }
/* Необходимые функции члена класса вектор; */
friend vector multiply(matrix&,vector&);
};/*-конец определения класса вектор; */
21
 Из табл. 2 видно,что в отношении производных типов специ-
фикатор доступа члена базового типа определяет лишь потенци-
альный статус этого члена.Его фактический статус в производном
типе зависит от спецификатора доступа типа,указываемого в за-
головке производного типа,и определяется следующим образом.Ес-
ли тип объявляется базовым для некоторого другого со специфи-
катором типа public,то личные члены базового типа становятся
личными членами производного типа,а защищенные члены базового
типа - защищенными членами производного типа.Если же тип объ-
является для некоторого другого типа базовым со спецификатором
доступа private,то личные и защищенные члены базового типа
становятся личными членами производного типа.
  Расмотренная система разграничения доступа к членам сос-
тавных типов легко может быть нарушена путем включения в оп-
ределение этого типа нового члена,являющегося описанием(или
даже определением) некоторой внешней функции с ключевым сло-
вом friend(друг).Функция-друг не имеет никаких особенностей,
помимо права доступа к любой,в том числе закрытой части
типа.В частности,функция-друг не имеет указателя this(если
только она не является полноправным членом типа).Описание
функции-друга вводит имя функции в самой внешней области ви-
димости программы и сопоставляется с другими описаниями или
определением этого имени.Описание друга может располагаться
или в закрытой,или в открытой части описания класса:где имен-
но,значения не имеет.
  Необходимость использования таких функций определяется
тем,что в языке С++ одна и та же функция не может быть од-
новременно членом двух и более классов,как это требуется,на-
пример,в следующем варианте умножения классов вектор и мат-
рица:
  class matrix;/*-предварительное описание класса матрицы;     */
  class vector /*-определение класса вектор:                   */
        { float v[4];
          float operator[](int i) { return v[i]; }
          /* Необходимые функции члена класса вектор;          */
          friend vector multiply(matrix&,vector&);
        };/*-конец определения класса вектор;                  */


                            21