Программирование на С++. Рейзлин В.И. - 18 стр.

UptoLike

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

20
dir D,*dp = &D;
base *p = &D;
bp –>print(); // base
dp –>print(); // dir
p –>print(); // dir
}
Таким образом, интерпретация каждого вызова виртуальной функ-
ции через указатель на базовый класс зависит от значения этого указателя,
т.е. от типа объекта, для которого выполняется вызов.
Выбор того, какую виртуальную функцию вызвать, будет зависеть от
типа объекта, на который фактически момент выполнения программы)
направлен указатель, а не от типа указателя.
Виртуальными могут быть только нестатические функции-члены.
Виртуальность наследуется. После того как функция определена как
виртуальная, ее повторное определение в производном классе тем же
самым прототипом) создает в этом классе новую виртуальную функцию,
причем спецификатор virtual может не использоваться.
Конструкторы не могут быть виртуальными, в отличие от деструкто-
ров. Практически каждый класс, имеющий виртуальную функцию, должен
иметь виртуальный деструктор.
Абстрактные классы
Абстрактным называется класс, в котором есть хотя бы одна чистая
(пустая) виртуальная функция.
Чистой виртуальной функцией называется компонентная функция,
которая имеет следующее определение:
virtual тип имя_функции (список_формальных_параметров) = 0;
Чистая виртуальная функция ничего не делает и недоступна для вы-
зовов. Ее назначение служить основой для подменяющих ее функций в
производных классах. Абстрактный класс может использоваться только в
качестве базового для производных классов.
Механизм абстрактных классов разработан для представления общих
понятий, которые в дальнейшем предполагается конкретизировать. При
этом построение иерархии классов выполняется по следующей схеме. Во
главе иерархии стоит абстрактный базовый класс. Он используется для на-
следования интерфейса. Производные классы будут конкретизировать и
реализовать этот интерфейс. В абстрактном классе объявлены чистые вир-
туальные функции, которые по сути есть абстрактные методы.
Пример.
class Base{
public: