Ошибки, баги, вопросы - страница 1890
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В чем ошибка выполнения
Все верно, нельзя приводиться снизу вверх, только сверху вниз. Это ради безопасности.
С С++ сравнивать нельзя - там все что угодно к чему угодно привести можно.
в С++ это тоже возможно только если указатель на базовый класс указывает на потомка.
Не понял что вы хотели этим сказать, но этот код:
Все верно, нельзя приводиться снизу вверх, только сверху вниз. Это ради безопасности.
С С++ сравнивать нельзя - там все что угодно к чему угодно привести можно.
теперь понятно, спс за разъяснения ))
Не понял что вы хотели этим сказать, но этот код:
Все верно, нельзя приводиться снизу вверх, только сверху вниз.
В смысле нельзя приводить от базового класса к потомку?
Да, в случае когда на базовом не лежит реально сконструированный потомок.
Все верно, нельзя приводиться снизу вверх, только сверху вниз. Это ради безопасности.
Да.
Ренат, вы в курсе что такое dynamic_cast?
Конечно.
Вы посмотрите на обсуждаемый кусок кода MQL5. Создается экземпляр базовый, а потом героически пытается преобразоваться через динамик каст в потомка в нарушение системы безопасности. Ну и облом конечно.
В документации прямо этот же пример рассмотрен и объяснен. Динамический кастинг при исполнении срабатывает только после прохождения проверки системы безопасности и допустимости преобразований. У каждого объекта MQL5 есть вся мета-информация для проверки прав во время исполнения. Это не пустой С++.
Динамическое приведение типов с помощью оператора dynamic_cast
Существует возможность динамического приведения типов с помощью оператора dynamic_cast, который может быть применён только к указателям классов. При этом проверка корректности типов производится в момент выполнения программы. Это означает, что при использовании оператора dynamic_cast компилятор не производит проверку типа данных, используемого для приведения. В случае, если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, результатом будет значение NULL.
dynamic_cast <type-id> ( expression )
Параметр type-id в угловых скобках должен быть указателем на ранее определённый тип класса. Тип операнда expression (в отличии от C++) может быть любым, кроме void.
Пример:
class CBar { };
class CFoo : public CBar { };
void OnStart()
{
CBar bar;
//--- динамическое приведение типа указателя *bar к указателю *foo разрешено
CFoo *foo = dynamic_cast<CFoo *>(&bar); // критической ошибки выполнения не возникнет
Print(foo); // foo=NULL
//--- попытка явного приведения ссылки объекта типа Bar к объекту типа Foo запрещено
foo=(CFoo *)&bar; // возникнет критическая ошибка выполнения
Print(foo); // эта строка не будет выполнена
}