Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2038

 
Mikhail Tkachev #:

Спасибо за ответ.
Ничего не понял)
Буду признателен за ссылку на пример

https://docs.mql4.com/ru/basis/oop/virtual

Виртуальные функции - Объектно-ориентированное программирование - Основы языка - Справочник MQL4
Виртуальные функции - Объектно-ориентированное программирование - Основы языка - Справочник MQL4
  • docs.mql4.com
Виртуальные функции - Объектно-ориентированное программирование - Основы языка - Справочник MQL4
 
Mikhail Tkachev #:

Сейчас попробовал, работает с virtual и без него одинаково.

Функция, определенная в базовом классе, и пререопределенная в производных классах, работает корректно и с virtual и без...

Т.е., при вызове objCalc.SomeFunction() всегда отрабатывает SomeFunction из нужного класса?

 
JRandomTrader #:

Т.е., при вызове objCalc.SomeFunction() всегда отрабатывает SomeFunction из нужного класса?

Да, я в каждую функцию SomeFunction()  вставил соответствующий Print(), вывод правильный в зависимости от свичера. который выбирает конкретный класс для создания объекта. 

 

Спасибо за ссылку. В этом примере нет моей ситуации- Когда именно нужно применять virtual, если функция базового класса переопределяется в производном классе...

 
Mikhail Tkachev #:

Да, в каждую функцию SomeFunction()  вставил соответствующий Print(), вывод правильный в зависимости от свичера. который выбирает конкретный класс для создания объекта. 

Создайте переменную-ссылку на базовый класс.

Запишите в неё ссылку на класс-потомок.

Вызывайте виртуальные и невиртуальные функции и смотрите результат.

 
PapaYozh #:

Создайте переменную-ссылку на базовый класс.

Запишите в неё ссылку на класс-потомок.


CLi_Calc01_GOn*   objCalc=NULL;  // Объявление 
.
.
.
         case 2:  objCalc=new CLi_Calc02_GO1( 50,1);    // Объект производного класса 02                 

А это не то ?

 
Mikhail Tkachev #:

Да, я в каждую функцию SomeFunction()  вставил соответствующий Print(), вывод правильный в зависимости от свичера. который выбирает конкретный класс для создания объекта. 

Можно попробовать

CLi_Calc01_GOn*   objCalc[10]={};

набить ссылками на объекты разных классов и вызывать objCalc[i].SomeFunction()

 
JRandomTrader #:

Можно попробовать

набить ссылками на объекты разных классов и вызывать objCalc[i].SomeFunction()

И что это даст ?
Я только что перебрал объекты классов, переключая input-параметр...

 
Mikhail Tkachev #:

И что это даст ?

Например, обойти излишний интеллект оптимизатора, если таковой в данном случае присутствует.

У меня в "боевых" роботах используется аналогичная конструкция и без virtual работает не так, как ожидается. Но это в MT5.

 
JRandomTrader #:

Например, обойти излишний интеллект оптимизатора, если таковой в данном случае присутствует.

У меня в "боевых" роботах используется аналогичная конструкция и без virtual работает не так, как ожидается. Но это в MT5.

Т.е. с virtual работает как предполагается, каждая функция вызывается из своего класса ?
Тогда просто оставлю virtual :)

Причина обращения: