Программирование на языке высокого уровня. Марапулец Ю.В. - 96 стр.

UptoLike

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

Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в
порядке, строго обратном вызову конструкторов: сначала вызывается деструктор
класса, затем - деструкторы элементов класса, а потом деструктор базового класса.
Работа с объектами чаще всего производится через указатели. Указателю на базо-
вый класс можно присвоить значение адреса объекта любого производного класса, на-
пример:
// Описывается указатель на базовый класс:
A *р;
// Указатель ссылается на объект производного класса:
р = new B;
Вызов методов объекта происходит в соответствии с типом указателя, а не факти-
ческим типом объекта, на который он ссылается. Поэтому при выполнении оператора
будет вызван метод класса A, а не класса B, поскольку ссылки на методы разрешаются
во время компоновки программы., например:
p->func();
Этот процесс называется
ранним связыванием. Чтобы вызвать метод класса B,
можно использовать явное преобразование типа указателя:
((B * p))->func();
Это не всегда возможно, поскольку в разное время указатель может ссылаться на
объекты разных классов иерархии, и во время компиляции программы конкретный класс
может быть неизвестен. В качестве примера можно привести функцию, параметром ко-
торой является указатель на объект базового класса. На его место во время выполнения
программы может быть передан указатель на любой производный класс. Другой пример
- связный список указателей на различные объекты иерархии, с которым требуется рабо-
тать единообразно.
В C++ реализован механизм
позднего связывания, когда разрешение ссылок на ме-
тод происходит на этапе выполнения программы в зависимости от конкретного типа
объекта, вызвавшего метод. Этот механизм реализован с помощью виртуальных методов
и будет рассмотрен далее.
Виртуальные методы. Для определения виртуального метода используется спе-
цификатор
virtual, например:
virtual void f(int x, int у);
Рассмотрим правила описания и использования виртуальных методов:
Если в базовом классе метод определен как виртуальный, метод, определенный в
производном классе с тем же именем и набором параметров, автоматически стано-
вится виртуальным, а с отличающимся набором параметров - обычным.
Виртуальные методы наследуются, то есть переопределять их в производном классе
требуется только при необходимости задать отличающиеся действия. Права доступа
при переопределении изменить нельзя.
Если виртуальный метод переопределен в производном классе, объекты этого класса
могут получить доступ к методу базового класса с помощью операции доступа к об-
ласти видимости.
96
•  Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в
   порядке, строго обратном вызову конструкторов: сначала вызывается деструктор
   класса, затем - деструкторы элементов класса, а потом деструктор базового класса.
     Работа с объектами чаще всего производится через указатели. Указателю на базо-
вый класс можно присвоить значение адреса объекта любого производного класса, на-
пример:

// Описывается указатель на базовый класс:
A *р;
// Указатель ссылается на объект производного класса:
р = new B;

     Вызов методов объекта происходит в соответствии с типом указателя, а не факти-
ческим типом объекта, на который он ссылается. Поэтому при выполнении оператора
будет вызван метод класса A, а не класса B, поскольку ссылки на методы разрешаются
во время компоновки программы., например:

p->func();

    Этот процесс называется ранним связыванием. Чтобы вызвать метод класса B,
можно использовать явное преобразование типа указателя:

((B * p))->func();

      Это не всегда возможно, поскольку в разное время указатель может ссылаться на
объекты разных классов иерархии, и во время компиляции программы конкретный класс
может быть неизвестен. В качестве примера можно привести функцию, параметром ко-
торой является указатель на объект базового класса. На его место во время выполнения
программы может быть передан указатель на любой производный класс. Другой пример
- связный список указателей на различные объекты иерархии, с которым требуется рабо-
тать единообразно.
      В C++ реализован механизм позднего связывания, когда разрешение ссылок на ме-
тод происходит на этапе выполнения программы в зависимости от конкретного типа
объекта, вызвавшего метод. Этот механизм реализован с помощью виртуальных методов
и будет рассмотрен далее.

    Виртуальные методы. Для определения виртуального метода используется спе-
цификатор virtual, например:

virtual void f(int x, int у);

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


                                          96