Виртуальный против абстрактного
Virtual и Abstract - это два ключевых слова, используемые в большинстве объектно-ориентированных (ОО) языков программирования, таких как Java и C. Хотя есть небольшие различия в том, что это означает на разных языках, ключевые слова Virtual и Abstract создают ощущение частичной реализации объектов, к которым они присоединяются.
Аннотация
Как правило, абстрактные классы, также известные как абстрактные базовые классы (ABC), не могут быть созданы (экземпляр этого класса не может быть создан). Таким образом, абстрактные классы имеют смысл иметь только в том случае, если язык программирования поддерживает наследование (возможность создавать подклассы из расширения класса). Абстрактные классы обычно представляют абстрактную концепцию или сущность с частичной реализацией или без нее. Таким образом, абстрактные классы действуют как родительские классы, от которых происходят дочерние классы, так что дочерний класс будет разделять неполные функции родительского класса, и для их дополнения могут быть добавлены функциональные возможности. Абстрактные классы могут содержать абстрактные методы. Подклассы, расширяющие абстрактный класс, могут реализовывать эти (унаследованные) абстрактные методы. Если дочерний класс реализует все такие абстрактные методы, это конкретный класс. Но если это не так, дочерний класс также становится абстрактным классом. Все это означает, что, когда программист назначает класс абстрактным, он говорит, что класс будет неполным и в нем будут элементы, которые должны быть дополнены унаследованными подклассами. Это хороший способ заключить договор между двумя программистами, упрощающий задачи по разработке программного обеспечения. Программист, который пишет код для наследования, должен точно следовать определениям методов (но, конечно, может иметь свою собственную реализацию). В Java и C абстрактные классы и методы объявляются с помощью ключевого слова Abstract.
Виртуальный
Виртуальные методы/функции обеспечивают возможность опционального переопределения своего поведения наследующим классом (используя функцию с той же сигнатурой). Концепция виртуальной функции важна в следующем сценарии. Предположим, что класс является производным от дочернего класса, тогда всякий раз, когда используется объект производного класса, он может ссылаться на объект базового класса или производного класса. Но поведение вызова метода может быть неоднозначным, если методы базового класса переопределены. Итак, чтобы разрешить эту двусмысленность, используется ключевое слово Virtual. Если метод помечен как Virtual, то вызывается функция производного класса (если есть) или вызывается функция базового класса. Например, в C++ ключевое слово Virtual используется именно для этой цели. В C ключевое слово Virtual используется аналогичным образом, но, кроме того, для изменения всех переопределенных методов следует использовать ключевое слово override. Но в Java нет явного ключевого слова Virtual. Все нестатические методы считаются виртуальными. Виртуальные функции без тела называются чисто виртуальными функциями. В Java и C абстрактные методы фактически являются Pure Virtual.
Разница между виртуальным и абстрактным
Хотя Абстрактное и Виртуальное - это два ключевых слова/понятия, которые придают смысл неполной реализации связанным с ним объектам, они имеют свои различия. Абстрактные методы (которые должны быть определены внутри абстрактных классов) вообще не имеют реализации, в то время как виртуальные методы могут иметь реализацию. Если абстрактные методы расширяются конкретным классом, все унаследованные абстрактные методы должны быть реализованы, а унаследованные виртуальные методы могут быть переопределены или нет.