Ошибки, баги, вопросы - страница 1742
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Есть подозрение что настройка заливки "Вернуть" вообще у всех торговых серверов стоит по-умолчанию (по крайней мере в FxPro так и ответили
Другими словами - это какая-то заглушка.В некоторых конторах (в частности недавно запустивших МТ5) необходимо явно указывать тип заливки - если не указывать будет ошибка.
Хотя, в том же Robo сервер возвращает true на проверку заполнения "Вернуть", но по факту этот тип заливки не работает. Короче полная путаница с этими заливками.
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
};
class B : public A
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
};
void OnStart()
{
// A* b = new B;
B* b = new B;
((A*)b).f();
delete b;
}
Правильно ли понимаю, что если virtual в потомке переопределен, то до базового virtual никогда не достучаться? Т.е. нельзя никак из b вызвать A::f.
Почти. В С++ разрешена следующая запись:
b.A::f();
Но здесь так нельзя. Поэтому только и исключительно костылем:
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
int f1()
{
return A::f();
}
};
Почти. В С++ разрешена следующая запись:
b.A::f();
Тогда не понимаю, почему в C++ это работает. Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.
Но здесь так нельзя. Поэтому только и исключительно костылем:
{
public:
virtual int f()
{
Print(__FUNCSIG__);
return(0);
}
int f1()
{
return A::f();
}
};
Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.
Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.
Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.
Тогда A* b = new B; не подойдет.
Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника.
Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.
Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.
Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника.
Как в отладчике посмотреть, какое значение вернула функция через return? Ставлю точку останова на return. Как попадаю на нее, жму F10. Как теперь увидеть, что же вышло в return?
но так как у вас все видимо на классах построено, то в скором времени можно ждать с десяток гневных писем как в Meta Editore ужасно, плохо, и не удобно с отладкой))
{
public:
void operator =( const string Value ) const { return; }
void operator =( const int Value ) { return; }
};
void OnStart()
{
const A a;
a = 0; // implicit conversion from 'number' to 'string'
}