
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В Array.mqh есть виртуальная функция QuickSort() и в ArrayObj.mqh тоже, но не виртуальная.
Не знаю, почему она не вритуальная в CArrayObj.
Интересно, что в CArrayDouble функция QuickSort() объявлена как виртуальная, а в CArrayObj функция QuickSort() объявлена без virtual. Хоть и там и там она в protected секции, то есть, допускается дальнейшее наследование.
Также не понимаю, почему стандартная библиотека не использует override совсем. С этим ключевым словом сильно прозрачнее было бы. А так я без тестов затрудняюсь понять, перегрузка это или переопределение (смущает параметр со значением по умолчанию):
Руками добавил override для QuickSort() в CArrayObj и скомпилировалось без ошибок. Наверное все-таки переопределение. Но что бы наверняка убедиться, нужно тестировать.
Также не понимаю, что здесь вызывается (это рекурсия или вызов метода базового класса; можно же было явно указать с помощью :: 😄):
...Также не понимаю, что здесь вызывается (это рекурсия или вызов метода базового класса; можно же было явно указать с помощью :: 😄):
Там рекурсия. В базовом классе QuickSort() - пустышка.
Интересно, что в CArrayDouble функция QuickSort() объявлена как виртуальная, а в CArrayObj функция QuickSort() объявлена без virtual. Хоть и там и там она в protected секции, то есть, допускается дальнейшее наследование.
Вроде, достаточно один раз в родительском классе объявить ф-цию виртуальной. Или зря мне так кажется?
Также не понимаю, что здесь вызывается (это рекурсия или вызов метода базового класса; можно же было явно указать с помощью :: 😄):
Или зря мне так кажется?
Вам не кажется
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Ilyas, 2023.03.27 23:16
Что будете делать, если ваш класс был порождён от класса, в котором функция, которую больше не должны переопределять, была объявлена виртуальной
Тем не менее, в одном наследнике (CArrayDouble) уже виртуальная функция с virtual, в другом (CArrayObj) - без.
Там рекурсия. В базовом классе QuickSort() - пустышка.
Понял, спасибо.
По поводу перегружен/переопределен, наверное тот код довольно очевидный для человека, который наизусть помнит Алгоритм выбора перегруженной функции и перегрузку методов. Но лично я хотел бы видеть модификатор override, хуже он не сделал бы.
Не знаю, почему она не вритуальная в CArrayObj.
Интересно, что в CArrayDouble функция QuickSort() объявлена как виртуальная, а в CArrayObj функция QuickSort() объявлена без virtual. Хоть и там и там она в protected секции, то есть, допускается дальнейшее наследование.
Также не понимаю, почему стандартная библиотека не использует override совсем. С этим ключевым словом сильно прозрачнее было бы. А так я без тестов затрудняюсь понять, перегрузка это или переопределение (смущает параметр со значением по умолчанию):
Руками добавил override для QuickSort() в CArrayObj и скомпилировалось без ошибок. Наверное все-таки переопределение. Но что бы наверняка убедиться, нужно тестировать.
Также не понимаю, что здесь вызывается (это рекурсия или вызов метода базового класса; можно же было явно указать с помощью :: 😄):
Наверное override просто погремушка для понимания при чтении кода.
В общем я понял так:
В классе CArray() функция объявлена виртуальной. В наследнике CArrayObj() уже не виртуальная. Следовательно если писать что-то потомком от CArrayObj() то функция не будет перегружена, или переопределена, я не знаю как правильно выразиться.
НО!!! Если в CArrayObj() её изменить и дописать ей virtual то в наследнике от CArrayObj() можно будет ещё раз написать свою реализацию QuickSort()
Хотя, это может быть совсем неправильно. Запутает так, что никогда не распутаешь…
Наверное override просто погремушка для понимания при чтении кода.
В общем я понял так:
В классе CArray() функция объявлена виртуальной. В наследнике CArrayObj() уже не виртуальная. Следовательно если писать что-то потомком от CArrayObj() то функция не будет перегружена, или переопределена, я не знаю как правильно выразиться.
НО!!! Если в CArrayObj() её изменить и дописать ей virtual то в наследнике от CArrayObj() можно будет ещё раз написать свою реализацию QuickSort()
Хотя, это может быть совсем неправильно. Запутает так, что никогда не распутаешь…
Смотрите этот пост и следующие два.
Вот код, который отвечает на ваш вопрос.
Нет.
То-есть в СБ отсутствие override к методу QuickSort() из CArrayObj() можно считать ошибкой?