Другие языки программирования и технологии
C++. Зачем определять чистую виртуальную функцию?
Вычитал, что в C++ допустимо определять чистую виртуальную функцию, без подробностей. Нифига не понял. Кто-то может прояснить ситуацию? Т. е. у производного класса от АБК будет это определение?
Да, чистая виртуальная функция обязательно должна быть переопределена. Если в классе есть хотя бы одна такая функция, нельзя создать объект этого класса.
Например, можно создать класс "Геометрическая Фигура". У него есть чисто виртуальный метод "Нарисовать". Он чисто виртуальный, поскольку разные геометрические фигуры отображаются по-разному.
В других языках есть ещё есть интерфейсы. Интерфейс - это подобие класса, в котором есть только чисто виртуальные функции.
Например, можно создать класс "Геометрическая Фигура". У него есть чисто виртуальный метод "Нарисовать". Он чисто виртуальный, поскольку разные геометрические фигуры отображаются по-разному.
В других языках есть ещё есть интерфейсы. Интерфейс - это подобие класса, в котором есть только чисто виртуальные функции.
Максим Кантышев
Так вот, если в производном классе ЧВФ должна быть переопределена, тогда зачем существует возможность определения (не объявления, т. е. не просто сигнатура = 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/
почитай что такое интерфейсы
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 секунда и готово.
Например, есть абстрактный класс 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 секунда и готово.
чисто пацанская функция
Похожие вопросы
- Виртуальные функции в c#,зачем они?
- подскажите чем виртуальная функция отличается от обычной функции
- C#. Как прописать несколько одинаковых функций так, чтобы они возвращали результаты разных типов?
- определение объема жесткого диска на C++. просьба написать кусок кода. функцию
- Вопрос для тех кто знает точный ответ, язык C про функции все подробности вопроса внутри...
- Функции в языке программирования C.
- C++ Указатели и функции.
- Виртуальные методы и функции
- Как передать функцию в качестве параметра другой функции на C++?
- C++ Везде написано, что sizeof() с массивом в качестве аргумента возвращает полный размер. А в данной функции не так.