Есть ли какой-либо сценарий, в котором вы хотели бы использовать виртуальную функцию вместо чистой виртуальной функции?

#c #virtual-functions #pure-virtual

#c #виртуальные функции #чисто виртуальный

Вопрос:

Я изучал виртуальные функции и базовые / виртуальные классы, и кажется, что не было бы сценария, в котором вы использовали бы виртуальную функцию в базовом классе вместо чисто виртуальной.

Комментарии:

1. Один из возможных сценариев — это когда ваш базовый класс предоставляет реализацию этой виртуальной функции по умолчанию, т. Е. Базовый класс не является абстрактным, и вы можете создать из него объект.

2. Базовый класс также может быть вполне допустимым объектом сам по себе. И функциональность, из которых, может быть расширена и переопределена с помощью наследования.

3. Существует несколько вариантов использования. Как уже упоминалось, типичным случаем является поведение по умолчанию, которое может быть изменено подклассом (обратите внимание, что сюда входит подкласс, написанный другим разработчиком, использующим ваш код в качестве библиотеки, например). Другой вид заключается в предоставлении «точек расширения» или обратных вызовов. Например. рассмотрим класс обработки заказов, у него может быть on_order_complete метод, который ничего не делает (но не является чистым), который подкласс может настроить. У вас даже могут быть классы, полные пустых виртуальных методов, которые позволяют настраивать различные части его поведения.

4. Обратите внимание, что иногда также может иметь смысл определить функцию как чисто виртуальную в базовом классе, но при этом обеспечить реализацию . Это заставляет производные классы переопределять / переопределять функцию, но все же обеспечивает базовую реализацию, которую производный класс может вызывать, если это необходимо / требуется.

5. Виртуальные функции, которые не являются чистыми, трудно правильно документировать. Они имеют свое применение, но новичку, вероятно, сначала следует писать только чисто виртуальные функции.

Ответ №1:

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

Допустим, в базовом классе есть 10 функций, и все они виртуальные. В вашем производном классе вам нужно переопределить только те функции, которые вы хотите, нет необходимости переопределять все 10 функций. Это упрощает реализацию производного класса. — вам не нужно переопределять все 10 функций.

Комментарии:

1. К ответу следует добавить, что на самом деле вы должны пометить метод так, как vritual если бы вы хотели его переопределить. Возможно, OP считает, что это необязательно и virtual похоже abstract на Java, что не так.