Лабораторный практикум по основам языка C/С++ |
Тема 4. Абстрактный класс. Иерархия
Объектно-ориентированная технология построения программ значительно увеличивает степень повторно используемого кода, поскольку, как можно видеть из предыдущей темы, порождение дочернего класса от родительского позволяет полностью наследовать код родителя, лишь дополнив его в потомке.
Однако не редко возникает необходимость переопределить в классе-потомке метод,
присутствующий в классе-предке. Например, если имеется класс точка (TPoint
), от
которого был порожден класс окружность (TCircle
), то метод перерисовки может называться
также (например Draw
), однако в нем должны быть команды вырисовывающие
уже не точку, а окружность.
При стандартной записи в потомке нельзя создать метод с таким же названием, что
и в предке. Однако при построении класса-предка можно указать какие методы могут быть
переопределены в потомках при помощи служебного слова virtual
.
Служебное слово virtual
(виртуальная) показывает, что функция
может иметь разные версии в разных производных классах, а выбор нужной версии
при ее вызове - это задача транслятора. Тип
функции указывается в базовом классе и не может быть переопределен
в производном классе.
Определение виртуальной функции должно даваться для того класса,
в котором она была впервые
описана (если только она не является чисто виртуальной функцией)
Если в производнам классе не происходит переопределение функции (виртуальной или нет) , то класс будет использовать версию функции базового класса. Если класс является частью длинной цепочки порождений, то будет использоваться самая последняя версия функции.
Следует также отметить, что в каждом классе почти всегда деструктор является виртуальным, поскольку он может и часто должен переопределяться в классе-потомке.
Если функция в классе объявляется виртуальной, то это не означает,
что в этом классе у нее не должно быть тела. Например, функция eat()
в
классе T_Animal
объявлена виртуальной, но мы можем добавить для
нее код:
При разработке иерархии классов всегда в качестве основы берут нечто, обладающее самыми общими атрибутами и методами, но не реализующееся в природе или в рассматриваемой области. Вот такая сущность называется абстрактным классом.
Для того, чтобы класс был асбтрактным у него должна быть хотя бы одна чисто виртуальная функция. Прототип чисто виртуальной функции заканчивается присваиванием к нулю. Абстрактный класс никогда не реализуется в виде объекта. Другими словами, создать объект виртуального класса нельзя!
Ниже представлен переписанный класс T_Animal
,
который в этой версии стал абстрактным. Как видно из представленного примера,
в абстрактном классе могут быть как чисто виртуальные функции, так и обычные функции,
имеющие тела.