Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот код, который отвечает на ваш вопрос.
То-есть в СБ отсутствие override к методу QuickSort() из CArrayObj() можно считать ошибкой?
Это не ошиба. Если вы не будете использовать override, то код будет работать так-же. Просто используя override вы сами себя страхуете от случайного изменения сигнатуры. Вы указываете компилятору, что метод с модификатором override должен переопределить метод базового класса, а если это не так (допустил опечатку в сигнатуре по невнимательности), то дай мне ошибку компиляции.
В добавок, при чтении кода вы сразу понимаете, какие методы из класса, который вы смотрите, переопределяют методы базового класса. Без override нужно открывать базовый класс и смотреть, какие методы там объявлены как виртуальные. В общем, перестраховка + улучшение читаемости.То-есть в СБ отсутствие override к методу QuickSort() из CArrayObj() можно считать ошибкой?
Наверное не override, а virtual. Если так, то нет, это не ошибка. Главное, что метод указан как виртуальный в родительском классе...
Охрененно "понятное" объяснение.
Если бы я так думал, то и написал бы. А вы чисто по женски за меня что-то придумали и на основе своих фантазий обвиняете.
В MQL5, как и в других языках программирования, таких как C++, существует важное различие между перегруженными и виртуальными функциями. Вот основные отличия:
Перегруженные функции
Определение: Перегрузка функций позволяет создавать несколько функций с одним и тем же именем, но с разными параметрами (типами, количеством или порядком). Это позволяет использовать одно и то же имя для разных операций, что делает код более читаемым.
Пример:
Выбор функции: Компилятор выбирает, какую перегруженную функцию вызывать, на основе аргументов, переданных при вызове.
Виртуальные функции
Определение: Виртуальные функции используются в контексте наследования и полиморфизма. Они позволяют производным классам переопределять поведение функции, определенной в базовом классе.
Пример:
Выбор функции: При вызове виртуальной функции выбор реализации происходит во время выполнения (runtime) на основе типа объекта, а не типа указателя или ссылки. Это позволяет динамически изменять поведение программы. Для этого компилятор создает в памяти таблицу виртуальных функций и в рантайме ищет в ней нужную реализацию.Кстати, именно поэтому вирт. функции вызываются медленнее, чем обычные.
Основные отличия
Это не ошиба. Если вы не будете использовать override, то код будет работать так-же. Просто используя override вы сами себя страхуете от случайного изменения сигнатуры. Вы указываете компилятору, что метод с модификатором override должен переопределить метод базового класса, а если это не так (допустил опечатку в сигнатуре по невнимательности), то дай мне ошибку компиляции.
В добавок, при чтении кода вы сразу понимаете, какие методы из класса, который вы смотрите, переопределяют методы базового класса. Без override нужно открывать базовый класс и смотреть, какие методы там объявлены как виртуальные. В общем, перестраховка + улучшение читаемости.Наверное не override, а virtual. Если так, то нет, это не ошибка. Главное, что метод указан как виртуальный в родительском классе...
Наверное вы не поняли что я сказал.
Вот класс class CArray : public CObject и в нём виртуальная функция
И вот наследник class CArrayObj : public CArray в котором эта функция переопределена
её полный код
Тут нет погремушки override
Вот я о чём…
Наверное вы не поняли что я сказал.
Вот класс class CArray : public CObject и в нём виртуальная функция
И вот наследник class CArrayObj : public CArray в котором эта функция переопределена
её полный код
Тут нет погремушки override
Вот я о чём…
Погремушка не обязательна. Она только для вашего удобства. Виртуальная функция будет переопределена независимо от наличия override.
Можете убрать из этого кода override и он будет работать точно так-же.
Но если вы допустите где-то опечатку (например, случайно указали немного другое имя функции), то при наличии override компилятор вам выдаст ошибку
А если там не будет override и вы допустите опечатку, то компиляция пройдет без ошибок, но вы пойдете дебажить потом.
Так и я о том-же. Погремушка она и есть погремушка никому не нужная. Просто для удобства чтения.
Погремушка не обязательна. Она только для вашего удобства. Виртуальная функция будет переопределена независимо от наличия override.
Можете убрать из этого кода override и он будет работать точно так-же.Так и я о том-же. Погремушка она и есть погремушка никому не нужная. Просто для удобства чтения.
Ну да… После добавления вашего сообщения, согласен. Это когда пишешь что-то своё, для предупреждения ошибки… Полезно.То-есть в СБ отсутствие override к методу QuickSort() из CArrayObj() можно считать ошибкой?
Если бы программист ошибся и написал QuicSort(), то компилятор пропустил бы эту ошибку, и в классе были бы 2 метода: родительский QuickSort() и собственный QuicSort(). Эта ошибка могла бы остаться незамеченной до поры до времени.
Однажды я случайно использовал кирилличную С в названии папки и долго не мог понять, почему компилятор не находит .mqh файл
Из-за использования подсказок, иногда бывает, что я замечаю опечатку в идентификаторе после того, как сослался на него уже десятки раз. Обычно следующим утром приходит озарение. Какой-нибудь условный "Direciton"Однажды я случайно использовал кирилличную С в названии папки и долго не мог понять, почему компилятор не находит .mqh файл
Так видно же:
Так видно же:
В проводнике. Имя папки содержало кирилличную букву, а в ME я указывал английскую.
К стати, если это строковый литерал в ME, то не будет видно.