Абстрактная функция или метод является общедоступным «именем операции», предоставляемым классом, его цель, наряду с абстрактными классами, в первую очередь заключается в предоставлении формы ограничения в проектировании объектов по отношению к структуре, которую объект должны реализовать.
Фактически классы, которые наследуют от его абстрактного класса, должны давать реализацию этого метода, обычно компиляторы выдают ошибки, когда они этого не делают.
Использование абстрактных классов и методов важно, главным образом, во избежание того, что при сосредоточении внимания на деталях реализации при разработке классов структура классов будет слишком связана с реализациями, поэтому создаются зависимости и связи между классами, которые сотрудничают между ними.
Виртуальная функция или метод - это просто метод, который моделирует публичное поведение класса, но мы можем оставить его свободным для изменения в цепочке наследования, потому что мы думаем, что дочерние классы могут нуждаться в реализовать некоторые конкретные расширения для этого поведения.
Они оба представляют форму полиморфизма в парадигме ориентации объекта.
Мы можем использовать абстрактные методы и виртуальные функции вместе для поддержки хорошей модели наследования.
Мы проектируем хорошую абстрактную структуру основных объектов нашего решения, затем создаем базовые реализации, определяя местонахождение тех, которые более склонны к дальнейшей специализации, и превращаем их в виртуальные, наконец, мы специализируем наши базовые реализации, в конечном итоге «переопределяя» унаследованные виртуальные. .