Подтвердить что ты не робот

Статическая броска по сравнению с динамическим приводом

Возможный дубликат:
Обычный листинг против static_cast vs. dynamic_cast

Я не совсем понимаю, когда использовать статическую трансляцию и динамическую. Любые объяснения, пожалуйста?

4b9b3361

Ответ 1

Используйте dynamic_cast при литье из базового класса в тип производного класса. Он проверяет, что выполняемый объект на самом деле относится к типу производного класса и возвращает нулевой указатель, если объект не имеет нужного типа (если только вы не выбрали ссылочный тип, а затем выбрасывает исключение bad_cast).

Используйте static_cast, если эта дополнительная проверка не требуется. Как сказал Аркаиц, поскольку dynamic_cast выполняет дополнительную проверку, для этого требуется информация RTTI и, следовательно, имеет большую служебную нагрузку во время выполнения, тогда как static_cast выполняется во время компиляции.

Ответ 2

В некоторых контекстах, подобных этому, "статический" относится к времени компиляции, а "динамический" относится к времени выполнения.

Для проверки времени компиляции используйте static_cast (ограниченный тем, что знает компилятор). Для проверки времени выполнения используйте dynamic_cast (ограниченный классами с RTTI). Для проверки не используйте reinterpret_cast.

Ответ 3

dynamic_cast проверяет информацию, доступную во время выполнения, например RTTI, она также перемещает иерархии классов, чтобы увидеть, возможно ли такое приведение.

Отметьте учебник по литью типа С++ на cplusplus.com

Ответ 4

Динамический бросок требует RTTI и делает некоторую магию по сравнению со статическим броском. static_cast - это всего лишь компиляция времени, проверяет, может ли класс происхождения быть продвинут к классу casted некоторыми простыми правилами как наследование.

Например, в случаях виртуального наследования только dynamic_cast может разрешить ситуацию.

Кроме того, dynamic_cast вернет NULL, если трансляция невозможна, поэтому вы можете принять другое решение.

С другой стороны, dynamic_cast работает медленнее, поскольку он подразумевает выполнение какого-либо кода, и, как сказано ранее, для него требуется RTTI, который увеличивает размер двоичных файлов.

Ответ 5

static_cast аналогичен старому стилю стиля C и может применяться практически ко всему. static_cast будет использоваться, когда вы найдете определенные типы. Например, я обычно использую static_cast при литье между int и enum.

dynamic_cast может использоваться только с указателями и ссылками. При отказе приведения возвращается нулевой указатель. dynamic_cast обычно используется при разрешении указателей на классы, используемые в наследовании, где вы хотите убедиться, что указатель, который вы выполняете, имеет ожидаемый тип.

Также проверьте С++: Документация: Учебное пособие по языку С++: Type Casting

Ответ 6

Статическое кастинг выполняется компилятором: он обрабатывает результат как целевой тип, независимо от того, что. Вы делаете это, когда абсолютно уверены в аргументе целевого типа.

Динамическое кастинг выполняется во время выполнения и, следовательно, требует информации о типе времени выполнения. Вы делаете это, когда не уверены в типе, который у вас есть: приведение может закончиться неудачей, что показано значением null. Это также можно сделать только для указателей и ссылок.

Ответ 7

Если вы говорите о С++. Тогда static_cast не является безопасным типом кастинга. Он может применяться к вашему типу, но если он ошибается, он не будет вызывать никаких ошибок/сообщений. Таким образом, вы получите от этого плохой объект. И dynamic_cast бросает ошибку, если кастинг не удался:) Надеюсь, это поможет!:)