Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Производные классы.doc
Скачиваний:
3
Добавлен:
01.09.2019
Размер:
95.74 Кб
Скачать

Абстрактные классы

Абстрактным классом называется класс, в котором есть хотя бы одна чистая (пустая) виртуальная функция. Чистой виртуальной называется компонентная функция, которая имеет следующее определение:

virtual тип имя_функции(список_формальных_параметров) = 0;

В этой записи конструкция “= 0” называется “чистый спецификатор”. Пример описания чистой виртуальной функции:

virtual void fpure(void) = 0;

Чистая виртуальная функция “ничего не делает” и недоступна для вызовов. Ее назначение - служить основой для подменяющих ее функций в производных классах. Исходя из этого становится понятной невозможность создания самостоятельных объектов абстрактного класса. Абстрактный класс может использоваться только в качестве базового для производных классов. При создании объектов такого производного класса в качестве подобъектов создаются объекты базового абстрактного класса. Пример:

class B

{ protected:

virtual void f(int) = 0;

void s(int);

};

class D: public B

{

. . .

void f(int);

};

class E: public B

{

. . .

void s(int);

};

Здесь B - абстрактный, D - нет, поскольку f - переопределена, а s - наследуется, E - абстрактный, так как s - переопределена, а f - наследуется.

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

По сравнению с обычными классами абстрактные классы пользуются “ограниченными правами”. Абстрактный класс нельзя употреблять для задания типа параметра функции или в качестве типа возвращаемого функцией значения. Абстрактный класс нельзя использовать при явном приведении типов. В то же время можно определять указатели и ссылки на абстрактные классы. Объект абстрактного класса не может быть формальным параметром функции, однако формальным параметром может быть указатель абстрактного класса. В этом случае появляется возможность передавать в вызываемую функцию в качестве фактического параметра значение указателя на производный объект, заменяя им указатель на абстрактный базовый класс.

Преобразование типов

В большинстве случаев сработает традиционное *(type*)&x, однако у программиста должна быть полная уверенность в возможности такого преобразования. В самом общем случае следует использовать один из новых операторов.

dynamic_cast<T*>(argptr) // требуется RTTI

static_cast<T>(arg) // выполняется на этапе компиляции