Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП Лекции PDF / ООП 09 Лек Виртуальные функции.pdf
Скачиваний:
64
Добавлен:
15.02.2015
Размер:
275.35 Кб
Скачать

Лекция 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

Чисто виртуальные функции могут быть не только объявлены, но и определены в абстрактном классе. Они могут быть непосредственно вызваны только с использованием следующего синтаксиса:

<имя_абстр_класса> :: <имя_вирт_функции>(<список_параметров>)

К абстрактным классам применимы следующие правила: нельзя объявить представитель абстрактного класса;

абстрактный класс не может использоваться в качестве типа аргумента, передаваемого функции; абстрактный класс не может использоваться в качестве типа возвращаемого значения функции; нельзя осуществлять явное преобразование типа объекта к типу абстрактного класса; можно объявить указатель или ссылку на абстрактный класс.

Выжол Ю.А.

Объектно-ориентированное программирование