Abstract - это особая форма
Virtual.
Разница заключается в том, что абстрактные методы не имеют тела, а только
декларацию. По существу это позволяет объявление интерфейса который может
осуществляться с помощью различных производных типов.
Чтобы вызвать абстрактный метод, он должен быть переопределен и реализован с
помощью производного типа данных, иначе программа будет прервана.
В результате для создания объектов допускаются только типы, которые
реализуют все абстрактные методы. По той же причине конструктор не должен
вызывать нереализованный метод.
Конструкторы не могут быть абстрактными,
так как они не могут быть виртуальными. Кроме того, абстрактные
Деструкторы не поддерживаются, потому что
тело деструктора (независимо от того, явно или неявно) необходимо для того,
чтобы вызвать базовый и поле деструктора.
Абстракции называются "pure virtual" в C++ (в отличие от FreeBASIC, C++
позволяет "pure virtuals" иметь тело, но доступно только статически).
Примечание: В многоуровневом наследовании, одноименный метод (тот же
идентификатор и сигнатура) может быть объявлен
Abstract,
Virtual
или обычным (без спецификатора) на каждом уровне иерархии наследования.
Когда происходит смешивание спецификаторов, обычный порядок абстрактный ->
виртуальный -> обычный, сверху вниз в иерархии наследования.
Контроль доступа (
Public/
Protected/
Private)
переопределения метода не учитывается внутренним процессом полиморфизма, а
учитывается только для первоначального вызова во время компиляции.
Производный статический метод не может переопределить базовый виртуальный /
абстрактный метод, но может затенить(заменить) любой базовый метод (включая
виртуальный\абстрактный).
См. также