Составители:
Рубрика:
• Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в
порядке, строго обратном вызову конструкторов: сначала вызывается деструктор
класса, затем - деструкторы элементов класса, а потом деструктор базового класса.
Работа с объектами чаще всего производится через указатели. Указателю на базо-
вый класс можно присвоить значение адреса объекта любого производного класса, на-
пример:
// Описывается указатель на базовый класс:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 94
- 95
- 96
- 97
- 98
- …
- следующая ›
- последняя »
