Не перегружается виртуальная функция - страница 2

 

Да, не используется.

Попробуйте так:

int OnInit() {
   Print("=== START ===");

   Strateg *strateg1;
   Strateg *strateg2;
   
   strateg1 = new Strateg();
   strateg2 = new Str_cloud();
   
   strateg1.log_close();
   strateg1.log_open_buy(1); 
   strateg1.log_open_buy(1.0); 

   strateg2.log_close();
   strateg2.log_open_buy(1); 
   strateg2.log_open_buy(1.0); 
   
   delete strateg1;
   delete strateg2;

   Print("=== END ===");
   return(INIT_FAILED);
}

Вывод:

=== 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()

 
Шо, опять? 
 
Yuriy Bykov #:

Да, не используется.

Попробуйте так:

Вывод:

=== 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(), пожалуйста. Мой пример относился к объявлению классов так, как было в этом сообщении.

Возможно, вы хотите чего-то другого от виртуальности методов, чем то, что виртуальность дает. Можете написать про то место, где не работает, какого поведения вы там ожидали?

Не перегружается виртуальная функция
Не перегружается виртуальная функция
  • 2022.12.16
  • www.mql5.com
Объявляю потомка в эксперте как ее правильно перегрузить? и почему аналогично написанные функции перегружаются, а эта нет...
 
Yuriy Bykov #:

Покажите полностью код с объявлением классов и их использованием в OnInit(), пожалуйста. Мой пример относился к объявлению классов так, как было в этом сообщении.

Возможно, вы хотите чего-то другого от виртуальности методов, чем то, что виртуальность дает. Можете написать про то место, где не работает, какого поведения вы там ожидали?

Кажется разобрался. В коде советника не было вызова перегруженной функции. Вот компилятор и сбрасывал точку останова. И поэтому перегружались остальные функции - в коде их вызов был.
Большое спасибо за помощь.

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