Объектно-ориентированное программирование на языке С++. Лясин Д.Н - 52 стр.

UptoLike

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

52
Квалифицированное имя компонента класса может быть использо-
вано и вне его компонентных функций. Для доступа в таком случае
можно использовать выражение вида
имя_объекта . имя_класса :: имя_компонента
//Листинг 21. Пример использования квалифицированного имени компонент класса
из
//его окружения:
main()
{ C c;
c.C::c2=0;
c.B::funcB();
c.A::a2=2;
c.C::funcA();
}
Поиск компонента при обращении к нему всегда идет "снизу-вверх". Для
вызова с.С::funcA() транслятор сначала проверит наличие функции funcA в классе
С и, если такой имеется, занесет адрес метода этого класса для вызова. Если в
классе С нет метода с таким названием, будет рассмотрен прямой базовый класс
для С (
в нашем случаекласс В) и поиск метода продолжится в нем. Если метод с
таким именем будет найденего адрес будет помещен на место вызова, иначе
поиск будет продолжен на следующем уровне иерархии классов (в классе А для
рассматриваемого примера).
Еще одно важное свойство базовых и производных классов
иллюстрируется в листинге
22.
//Листинг 22. Приведение указателей производного класса к базовому
main()
{A *pta;
C c;
pta=&c;
pta->funcA();
}
.
В программе определен указатель на базовый класс A и объект
производного класса С. При этом присвоение указателю pta адреса объекта c не
потребовало операций приведения типа.
Данный пример показывает, что
указатель на базовый класс может ссылаться на объекты производных классов.
              Квалифицированное имя компонента класса может быть использо-
         вано и вне его компонентных функций. Для доступа в таком случае
         можно использовать выражение вида
              имя_объекта . имя_класса :: имя_компонента
         //Листинг 21. Пример использования квалифицированного имени компонент класса
         из
         //его окружения:
         main()
         { C c;
           c.C::c2=0;
           c.B::funcB();
           c.A::a2=2;
           c.C::funcA();
         }
      Поиск компонента при обращении к нему всегда идет "снизу-вверх". Для
вызова с.С::funcA() транслятор сначала проверит наличие функции funcA в классе
С и, если такой имеется, занесет адрес метода этого класса для вызова. Если в
классе С нет метода с таким названием, будет рассмотрен прямой базовый класс
для С (в нашем случае – класс В) и поиск метода продолжится в нем. Если метод с
таким именем будет найден – его адрес будет помещен на место вызова, иначе –
поиск будет продолжен на следующем уровне иерархии классов (в классе А для
рассматриваемого примера).
      Еще    одно     важное     свойство       базовых   и    производных   классов
иллюстрируется в листинге 22.
      //Листинг 22. Приведение указателей производного класса к базовому
      main()
      {A *pta;
        C c;
       pta=&c;
      pta->funcA();
      }.
       В программе определен указатель на базовый класс A и объект
производного класса С. При этом присвоение указателю pta адреса объекта c не
потребовало операций приведения типа. Данный пример показывает, что
указатель на базовый класс может ссылаться на объекты производных классов.

                                           52