![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, не используется.
Попробуйте так:
Вывод:
=== START ===
Strateg::log_close
Strateg::log_open_buy1
Strateg::log_open_buy1.0
Str_cloud::log_close
Str_cloud::log_open_buy1
Strateg::log_open_buy1.0
=== END ===
Вы переопределили в производном классе только функции с сигнатурами void log_close() и void log_open_buy(int). Поэтому когда вы обращаетесь через указатель на базовый класс strateg2 к объекту производного класса, то вызываются функции именно производного класса. Если в производном классе нет виртуальной функции, совпадающей по сигнатуре с виртуальной функцией базового класса, то в этом случае будет вызываться функция базового класса. Это мы видим на примере последнего вызова strateg2.log_open_buy(1.0), так как у нее сигнатура void log_open_buy(double).
В производном классе можно даже не писать слово virtual перед переопределяемой функцией. Достаточно, что это слово написано в базовом классе. Поэтому вызывается через strateg2 именно Str_cloud::log_close(), а не Strateg::log_close()
Да, не используется.
Попробуйте так:
Вывод:
=== START ===
Strateg::log_close
Strateg::log_open_buy1
Strateg::log_open_buy1.0
Str_cloud::log_close
Str_cloud::log_open_buy1
Strateg::log_open_buy1.0
=== END ===
Вы переопределили в производном классе только функции с сигнатурами void log_close() и void log_open_buy(int). Поэтому когда вы обращаетесь через указатель на базовый класс strateg2 к объекту производного класса, то вызываются функции именно производного класса. Если в производном классе нет виртуальной функции, совпадающей по сигнатуре с виртуальной функцией базового класса, то в этом случае будет вызываться функция базового класса.
большое спасибо за развернутый комментарий. но что-то васе равно не работает. сделал как вы - определил класс-наследник, перегрузил функцию. для чистоты эксперимента убрал из нее параметр.
объявил экземпляр через ссылку
strateg *strat;
потом в онинит
strat = new str_cloud();
но запускаются функции все равно из основного класса! Не перегружаются!
Покажите полностью код с объявлением классов и их использованием в OnInit(), пожалуйста. Мой пример относился к объявлению классов так, как было в этом сообщении.
Возможно, вы хотите чего-то другого от виртуальности методов, чем то, что виртуальность дает. Можете написать про то место, где не работает, какого поведения вы там ожидали?
Покажите полностью код с объявлением классов и их использованием в OnInit(), пожалуйста. Мой пример относился к объявлению классов так, как было в этом сообщении.
Возможно, вы хотите чего-то другого от виртуальности методов, чем то, что виртуальность дает. Можете написать про то место, где не работает, какого поведения вы там ожидали?
Кажется разобрался. В коде советника не было вызова перегруженной функции. Вот компилятор и сбрасывал точку останова. И поэтому перегружались остальные функции - в коде их вызов был.
Большое спасибо за помощь.