Другие языки программирования и технологии

C++. Зачем определять чистую виртуальную функцию?

Вычитал, что в C++ допустимо определять чистую виртуальную функцию, без подробностей. Нифига не понял. Кто-то может прояснить ситуацию? Т. е. у производного класса от АБК будет это определение?
Да, чистая виртуальная функция обязательно должна быть переопределена. Если в классе есть хотя бы одна такая функция, нельзя создать объект этого класса.
Например, можно создать класс "Геометрическая Фигура". У него есть чисто виртуальный метод "Нарисовать". Он чисто виртуальный, поскольку разные геометрические фигуры отображаются по-разному.
В других языках есть ещё есть интерфейсы. Интерфейс - это подобие класса, в котором есть только чисто виртуальные функции.
Sogdiec Zaroostriec
Sogdiec Zaroostriec
58 065
Лучший ответ
Максим Кантышев Так вот, если в производном классе ЧВФ должна быть переопределена, тогда зачем существует возможность определения (не объявления, т. е. не просто сигнатура = 0) ЧВФ? Я этого не понял.
любой модуль представляет собой черный ящик, то есть мы не знаем как он реализован, но он предоставляет нам API. API это набор интерфейсов и фабрик.
почитай что такое интерфейсы
javarush.ru/groups/posts/1981-dlja-chego-v-java-nuzhnih-interfeysih
как они реализуются в плюсах
qaru.site/questions/4041/how-to-implement-interfaces-in-c

обязательно посмотри шаблоны проектирования. они общие для большинства языков. статей много, например здесь
habr.com/ru/post/210288/
Herman Gizberg ссылки нерабочие
Herman Gizberg а не вру, просто грузились долго почему-то
>> Зачем определять чистую виртуальную функцию?
для механизмов наследования что бы заставить наследников реализовывать методы и избегать ошибок ожидаемых но не реализованных методов.
Максим Кантышев Ты не понял. В АБК можно ОПРЕДЕЛИТЬ ЧВФ. Но в производном классе она должна быть ПЕРЕОПРЕДЕЛЕНА. Тога зачем вообще есть такая возможность?
Для реализации полиморфизма, в этом суть ООП.

Например, есть абстрактный класс Shape (фигура) с чистым методом area() (площадь фигуры). Непонятно, что за площадь у абстрактной фигуры, поэтому здесь функция не определена.

И есть наследники, конкретные фигуры с имплементацией area(): Circle, Square, Rhomb, Triangle, ..

Допустим, я создал круг:

Shape shape = new Circle();

И дальше вызываю везде, где мне нужно shape.area() хотя 1000 раз. Но вдруг, узнается, что мне нужен не круг, а квадрат. Мне не потребуется для этого заново переписывать 1000 строк кода, а будет достаточно только одной:

Shape shape = new Square();

Если, например, я работаю с коллекцией, то могу задать ее через абстрактный класс List

List collection = new ArrayList() // Обычный массив

Но вдруг понял, что мне необходим связный список, тогда одно движение

List collection = new LinkedList()

и вуаля, 1 секунда и готово.
чисто пацанская функция