Тема 4. Абстрактный класс. Иерархия

Объектно-ориентированная технология построения программ значительно увеличивает степень повторно используемого кода, поскольку, как можно видеть из предыдущей темы, порождение дочернего класса от родительского позволяет полностью наследовать код родителя, лишь дополнив его в потомке.

Однако не редко возникает необходимость переопределить в классе-потомке метод, присутствующий в классе-предке. Например, если имеется класс точка (TPoint), от которого был порожден класс окружность (TCircle), то метод перерисовки может называться также (например Draw), однако в нем должны быть команды вырисовывающие уже не точку, а окружность.

При стандартной записи в потомке нельзя создать метод с таким же названием, что и в предке. Однако при построении класса-предка можно указать какие методы могут быть переопределены в потомках при помощи служебного слова virtual.

Служебное слово virtual (виртуальная) показывает, что функция может иметь разные версии в разных производных классах, а выбор нужной версии при ее вызове - это задача транслятора. Тип функции указывается в базовом классе и не может быть переопределен в производном классе. Определение виртуальной функции должно даваться для того класса, в котором она была впервые описана (если только она не является чисто виртуальной функцией)

Если в производнам классе не происходит переопределение функции (виртуальной или нет) , то класс будет использовать версию функции базового класса. Если класс является частью длинной цепочки порождений, то будет использоваться самая последняя версия функции.

Следует также отметить, что в каждом классе почти всегда деструктор является виртуальным, поскольку он может и часто должен переопределяться в классе-потомке.

Если функция в классе объявляется виртуальной, то это не означает, что в этом классе у нее не должно быть тела. Например, функция eat() в классе T_Animal объявлена виртуальной, но мы можем добавить для нее код:

При разработке иерархии классов всегда в качестве основы берут нечто, обладающее самыми общими атрибутами и методами, но не реализующееся в природе или в рассматриваемой области. Вот такая сущность называется абстрактным классом.

Для того, чтобы класс был асбтрактным у него должна быть хотя бы одна чисто виртуальная функция. Прототип чисто виртуальной функции заканчивается присваиванием к нулю. Абстрактный класс никогда не реализуется в виде объекта. Другими словами, создать объект виртуального класса нельзя!

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