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

vponed  
class strateg {

private:

int chtototam;

public:

virtual  bool              Good_time_trade();

 virtual    bool              log_open_buy() {
      return (PositionsTotal() == 0 && OrdersTotal() == 0); }

virtual bool              log_close(); {  return false; }

};

Объявляю потомка в эксперте
class str_cloud : public strateg {
public:
  bool log_close()  {  // не работает
return true; 
}
bool              log_open_buy(int vol_proc_raz) { // работает. и все прочие тоже!
if(vol_proc_raz > 0) return true;
return false;}
};

как ее правильно перегрузить? и почему аналогично написанные функции перегружаются, а эта нет?

JRandomTrader  
virtual bool              log_close(); {  return false; }
vponed  
JRandomTrader #:
так ошибку кажет. весь код ломается
JRandomTrader  
vponed #:
так ошибку кажет. весь код ломается

Так это в вашем приведённом коде.

Приводите точный код, который у вас не перегружается. И где/как используется - тоже.

vponed  
JRandomTrader #:

Так это в вашем приведённом коде.

Приводите точный код, который у вас не перегружается. И где/как используется - тоже.

// в библиотеке
class strateg2
  {
public:
 virtual    bool              log_open_buy() {
      return (PositionsTotal() == 0 && OrdersTotal() == 0); }
   virtual bool              log_open_sell() {
      return (PositionsTotal() == 0 && OrdersTotal() == 0); }
   virtual bool              log_close() {  
   
   return false;
   } 
  };

// в эксперте
class proba: public strateg2{
 bool log_close()  {
      if(PositionsTotal() > 0 && PositionSelect(_Symbol)) {
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && log_open_sell()) {
            Print(1); }
         if(((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && log_open_buy())) {
            Print(2); } }

      return ((PositionsTotal() > 0 && PositionSelect(_Symbol)) &&
              (((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && log_open_sell()) ||
               ((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && log_open_buy()))); }
};
JRandomTrader  
vponed #:

У вас в proba::log_close() всегда будет false из-за "&& log_open_*()", в которых проверка "PositionsTotal() == 0", а вы перед этим проверяете "PositionsTotal() > 0". И Print'ы никогда не отработают.

vponed  
JRandomTrader #:

У вас в proba::log_close() всегда будет false из-за "&& log_open_*()", в которых проверка "PositionsTotal() == 0", а вы перед этим проверяете "PositionsTotal() > 0". И Print'ы никогда не отработают.

дело не совсем в принтах. хотя на ошибку вы мне правильно указали. но компилятор не попадает туда в принципе. я убрал этот кусочек с log_open_buy, но сама галочка отладки следает при тестировании. работает именно функция из библиотеки. она не перегрузилась в эксперте.
JRandomTrader  
vponed #:
дело не совсем в принтах. хотя на ошибку вы мне правильно указали. но компилятор не попадает туда в принципе. я убрал этот кусочек с log_open_buy, но сама галочка отладки следает при тестировании. работает именно функция из библиотеки. она не перегрузилась в эксперте.

На всякий случай покажите создание и использование объекта.

Убедитесь, что на самом деле подключаете именно ту библиотеку, где функция объявлена как virtual.

Или напишите минимальный код, гарантированно воспроизводящий ошибку, и напишите в https://www.mql5.com/ru/forum/1111

Если ошибка действительно есть и у разработчиков воспроизведётся - могут поправить.

Dmitry Fedoseev  
C log_close() работает, а с log_open_buy() - нет, потому что разница с параметрами. В базовом классе без параметров, а в производном с параметром. 
trader6_1  

Примерчик накидал...

class Strateg {
   public:
      virtual void log_close() {
         Print(__FUNCTION__);
      }
      virtual void log_open_buy(int a) {
         Print(__FUNCTION__, a);
      }
      virtual void log_open_buy(double a) {
         Print(__FUNCTION__, a);
      }
};

class Str_cloud : public Strateg {
   public:
      void log_close() {
         Print(__FUNCTION__);
      }
      virtual void log_open_buy(int a) {
         Print(__FUNCTION__, a);
      }
};

int OnInit() {
   Print("=== START ===");
   
   Strateg strateg = Strateg();
   strateg.log_close();

   Str_cloud str_cloud = Str_cloud();
   str_cloud.log_close();
   str_cloud.log_open_buy(1);
   str_cloud.log_open_buy(1.0);
   
   Print("=== END ===");
   return(INIT_FAILED);
}

Вывод:

=== START ===

Strateg::log_close

Str_cloud::log_close

Str_cloud::log_open_buy1

Strateg::log_open_buy1.0

=== END ===


Koldun Zloy  
trader6_1 #:

Примерчик накидал...

Вывод:

=== START ===

Strateg::log_close

Str_cloud::log_close

Str_cloud::log_open_buy1

Strateg::log_open_buy1.0

=== END ===


В вашем примере виртуальность не используется.

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