Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Виртуальные методы полезны только при использовании указателей. Если указатели не используются, virtual не пригодится.
Полно примеров для начинающих, где есть, например, множество Животное с виртуальной функцией звука от него. И есть его производные "подмножества": собаки, кошки и т.д. И у каждого из них своя реализация общей виртуальной функции звука: лай, мяуканье и т.д.
И если используются указатели, то можно собаку обобщить, сказав всем, что это Животное (указатель). Но при этом оно будет лаять.
В итоге можно, например, наплодить (создать объекты) собак, кошек и баранов. Затем загнать их в один одинаковый загон Животных (массив указателей на Животных). И, вроде, в массиве все Животные, но звук будет каждый издавать свой: лаять, мяукать, блеять.
Хорошее объяснение!
В чём прикол? В чём полезность виртуальности?
В том, что с помощью виртуальных методов реализуется полиморфизм - один из столпов ООП. Вот представьте себе стадо (группу) зверей, о котором писали выше. Там есть кошки, собаки, бараны и т.д. Пусть берём в цикле каждое животное и просим, чтобы оно издало звук. Заранее мы не знаем, кто нам попадётся. Но у каждого есть свой виртуальный метод озвучивания. И на этапе выполнения программы (run-time) он должен сработать и правильно озвучить выбранное животное.
Полно примеров для начинающих, где есть, например, множество Животное с виртуальной функцией звука от него. И есть его производные "подмножества": собаки, кошки и т.д. И у каждого из них своя реализация общей виртуальной функции звука: лай, мяуканье и т.д.
И если используются указатели, то можно собаку обобщить, сказав всем, что это Животное (указатель). Но при этом оно будет лаять.
В итоге можно, например, наплодить (создать объекты) собак, кошек и баранов. Затем загнать их в один одинаковый загон Животных (массив указателей на Животных). И, вроде, в массиве все Животные, но звук будет каждый издавать свой: лаять, мяукать, блеять.
Прикол в том, что вы описываете интерфейс, либо абстрактный класс с чисто виртуальным методом. Вряд-ли какое-либо животное будет использовать реализацию из базового класса (для метода издавания звука).
Гораздо сложнее придумать простой пример для виртуальных методов, когда использование реализации базового класса может быть уместным на ряду с ее заменой производными классами. Лично я не могу простой пример придумать для этого.
То-есть функция в потомке просто заменяет функцию родителя?
Если так, то зачем всё это городить если простая функция будет работать так-же…
Да, можно перезагрузить функцию в потомке и она заменит родительскую.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Учёба. Классы. Нужна помощь.
fxsaber, 2024.11.22 19:54
Кусок кода (см. вложение) для их вычисления привожу здесь, как пример реальной задачи, которая просто решается только через ООП.
Например, если захотеть посмотреть процитированный исходник, то там будет использоваться слово virtual. Но для его работоспособности этот virtual не нужен, т.к.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Учёба. Классы. Нужна помощь.
fxsaber, 2024.12.16 10:30
Виртуальные методы полезны только при использовании указателей. Если указатели не используются, virtual не пригодится.
Т.е. все будет работать через механизм перегрузки, если убрать virtual.
Однако, по какой-то причине virtual там написан. Причина в том, что потенциально в будущем возможна работа с этими объектами через указатели. И тогда механизм перегрузки будет давать совсем не тот эффект, что потребуется. Прописывание виртуальности определяет разработчик часто на основе просто опыта/интуиции. Опытные почти сразу видят, что может быть virtual и прописывают. Даже если пока не собираются это использовать. Примерно так и получилось с CTrade.
Прикол в том, что вы описываете интерфейс, либо абстрактный класс с чисто виртуальным методом. Вряд-ли какое-либо животное будет использовать реализацию из базового класса (для метода издавания звука).
Гораздо сложнее придумать простой пример для виртуальных методов, когда использование реализации базового класса может быть уместным на ряду с ее заменой производными классами. Лично я не могу простой пример придумать для этого.
Может так случиться, что многие животные не издают звуков. Тогда базовая виртуальная функция звука животного - тишина. И нам нужно писать реализацию звука нового животного только тогда, когда мы знаем, как оно звучит. Не знаем - не прописываем. Т.е. удобно (код лаконичный), когда базовая виртуальная функция прописана.
Прикол в том, что вы описываете интерфейс, либо абстрактный класс с чисто виртуальным методом. Вряд-ли какое-либо животное будет использовать реализацию из базового класса (для метода издавания звука).
Можно сделать и реализацию в базовом классе как метод по умолчанию. Например:
Т.е. если у животного нет своей реализации звука, то предполагается, что оно молчит ))
В том, что с помощью виртуальных методов реализуется полиморфизм - один из столпов ООП. Вот представьте себе стадо (группу) зверей, о котором писали выше. Там есть кошки, собаки, бараны и т.д. Пусть берём в цикле каждое животное и просим, чтобы оно издало звук. Заранее мы не знаем, кто нам попадётся. Но у каждого есть свой виртуальный метод озвучивания. И на этапе выполнения программы (run-time) он должен сработать и правильно озвучить выбранное животное.
Вот такими объяснениями, простите загажены, все учебники и примеры. Это ни о чём. Мне кажется это легко решается обычной перегрузкой функции… Это не утверждение, могу и заблуждаться…
Если так, то зачем всё это городить если простая функция будет работать так-же… В чём прикол? В чём полезность виртуальности?
Да, логично. Но я бы наверное предпочел обязать себя явно реализовать молчание. Просто чтобы в дальнейшем ничего не провтыкать.
Я бы еще отладочную информацию добавил:
[edit]
Хотя, возможно не стояло прятать speak() в приватную секцию для рыбы.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Alain Verleyen, 2024.12.15 18:46
открытый интерфейс в иерархии классов следует уважать
[edit 2]
Та не, она же виртуальная, можно и спрятать, я думаю. Ведь область видимости виртуальных методов всегда указывается заново в производном классе.
Вот такими объяснениями, простите загажены, все учебники и примеры. Это ни о чём. Мне кажется это легко решается обычной перегрузкой функции… Это не утверждение, могу и заблуждаться…
Алексей, у Вас есть критическое мышление, что продвигает Вас на шаг ближе ))
Вот возьмём мой пример выше и просто переопределим метод озвучивания.
В журнале мы увидим такое:
Т.е. программа всегда вызывала метод родительского класса, без учёта классовой иерархии.