
- •Раннее и позднее связывание. Динамический полиморфизм
- •Виртуальные функции
- •Базовый класс координат
- •Производный класс точки
- •Производный класс вектора
- •Виртуальные деструкторы
- •Базовый класс координат
- •Производный класс точки
- •Абстрактные классы и чисто виртуальные функции
- •Абстрактный базовый класс координат
- •Производный класс точки
Лекция 9 |
Виртуальные функции |
5 |
Delete x , y
В связи с этим можно сформулировать следующие правила:
виртуальный деструктор целесообразно использовать, если в базовом классе имеются виртуальные функции;
виртуальные функции целесообразно использовать только в том случае, если программа содержит и базовый, и производный классы;
нельзя создать виртуальный конструктор.
Абстрактные классы и чисто виртуальные функции
Классы могут быть созданы для того, чтобы предписать протокол взаимодействия с объектами, принадлежащими соответствующему типу. Эти классы называются "абстрактными", потому что никакой объ-
ект этого класса не может быть создан. Они существуют исключительно для создания производных классов.
Абстрактный класс – это класс, содержащий, по меньшей мере, одну чисто виртуальную функ-
цию. Производные от него классы должны реализовывать эти чисто виртуальные функции, иначе, если останется хоть одна нереализованная чисто виртуальная функция, такой класс также будет абстрактным. Чисто виртуальная функция объявляется с помощью следующего синтаксиса:
virtual <имя_функции>(<список параметров>) = 0 ;
Рассмотрим пример. Предположим, проектируется иерархия классов, причем базовый класс этой иерархии с именем Coord должен обеспечить общие функциональные возможности, но объекты типа Coord являются слишком общими, чтобы быть полезными. В этом случае класс Coord является хорошим кандидатом в абстрактные классы:
Абстрактный базовый класс координат |
|
class Coord |
// абстрактный базовый класс координат |
{ |
|
protected: |
// защищённые члены класса |
double x , y ; |
// координаты |
public: |
// открытые члены класса |
Coord ( ) { x = 0 ; y = 0 ; } |
// конструктор базового класса |
virtual void Print ( ) = 0 ; |
// объявляет чисто виртуальную функцию |
} ; |
|
Производный класс точки |
|
class Dot : public Coord |
// наследник класса координат |
{ |
|
char name ; |
// имя точки |
public: |
// открытые члены класса |
Dot (char N ) : Coord ( ) { name = N ; } |
// вызывает конструктор базового класса |
// void Print ( ) ; |
// отсутствие переопределения чисто виртуальной |
} ; |
// функции Print ( ) делает класс абстрактным |
|
|
void main ( ) |
|
{ |
|
Coord C ; |
// ошибка: нельзя создать объект абстрактного класса |
Dot D ; |
// ошибка: нельзя создать объект абстрактного класса |
} |
|
Путем задания чисто виртуальной функции Print ( ) класса добивается того, что любой неабстрактный класс, жет быть реализован без функции Print ( ).
при проектировании класса Coord разработчик являющийся производным класса Coord, не мо-
Существуют определенные ограничения на использование абстрактных классов. Они не могут использоваться в качестве:
переменных, являющихся членами некоторых других классов; типов передаваемых в функцию аргументов; типов возвращаемых функцией значений; типов явных преобразований.
Другое ограничение состоит в том, что если конструктор абстрактного класса вызывает чисто виртуальную функцию, прямо или косвенно, результат непредсказуем.
Выжол Ю.А. |
Объектно-ориентированное программирование |
Лекция 9 |
Виртуальные функции |
6 |
Чисто виртуальные функции могут быть не только объявлены, но и определены в абстрактном классе. Они могут быть непосредственно вызваны только с использованием следующего синтаксиса:
<имя_абстр_класса> :: <имя_вирт_функции>(<список_параметров>)
К абстрактным классам применимы следующие правила: нельзя объявить представитель абстрактного класса;
абстрактный класс не может использоваться в качестве типа аргумента, передаваемого функции; абстрактный класс не может использоваться в качестве типа возвращаемого значения функции; нельзя осуществлять явное преобразование типа объекта к типу абстрактного класса; можно объявить указатель или ссылку на абстрактный класс.
Выжол Ю.А. |
Объектно-ориентированное программирование |