Возможный дубликат:
Обычный листинг против static_cast vs. dynamic_cast
Я не совсем понимаю, когда использовать статическую трансляцию и динамическую. Любые объяснения, пожалуйста?
Возможный дубликат:
Обычный листинг против static_cast vs. dynamic_cast
Я не совсем понимаю, когда использовать статическую трансляцию и динамическую. Любые объяснения, пожалуйста?
Используйте dynamic_cast
при литье из базового класса в тип производного класса. Он проверяет, что выполняемый объект на самом деле относится к типу производного класса и возвращает нулевой указатель, если объект не имеет нужного типа (если только вы не выбрали ссылочный тип, а затем выбрасывает исключение bad_cast
).
Используйте static_cast
, если эта дополнительная проверка не требуется. Как сказал Аркаиц, поскольку dynamic_cast
выполняет дополнительную проверку, для этого требуется информация RTTI и, следовательно, имеет большую служебную нагрузку во время выполнения, тогда как static_cast
выполняется во время компиляции.
В некоторых контекстах, подобных этому, "статический" относится к времени компиляции, а "динамический" относится к времени выполнения.
Для проверки времени компиляции используйте static_cast (ограниченный тем, что знает компилятор). Для проверки времени выполнения используйте dynamic_cast (ограниченный классами с RTTI). Для проверки не используйте reinterpret_cast.
dynamic_cast проверяет информацию, доступную во время выполнения, например RTTI, она также перемещает иерархии классов, чтобы увидеть, возможно ли такое приведение.
Динамический бросок требует RTTI и делает некоторую магию по сравнению со статическим броском. static_cast - это всего лишь компиляция времени, проверяет, может ли класс происхождения быть продвинут к классу casted некоторыми простыми правилами как наследование.
Например, в случаях виртуального наследования только dynamic_cast может разрешить ситуацию.
Кроме того, dynamic_cast вернет NULL, если трансляция невозможна, поэтому вы можете принять другое решение.
С другой стороны, dynamic_cast работает медленнее, поскольку он подразумевает выполнение какого-либо кода, и, как сказано ранее, для него требуется RTTI, который увеличивает размер двоичных файлов.
static_cast
аналогичен старому стилю стиля C и может применяться практически ко всему. static_cast
будет использоваться, когда вы найдете определенные типы. Например, я обычно использую static_cast
при литье между int
и enum
.
dynamic_cast
может использоваться только с указателями и ссылками. При отказе приведения возвращается нулевой указатель. dynamic_cast
обычно используется при разрешении указателей на классы, используемые в наследовании, где вы хотите убедиться, что указатель, который вы выполняете, имеет ожидаемый тип.
Также проверьте С++: Документация: Учебное пособие по языку С++: Type Casting
Статическое кастинг выполняется компилятором: он обрабатывает результат как целевой тип, независимо от того, что. Вы делаете это, когда абсолютно уверены в аргументе целевого типа.
Динамическое кастинг выполняется во время выполнения и, следовательно, требует информации о типе времени выполнения. Вы делаете это, когда не уверены в типе, который у вас есть: приведение может закончиться неудачей, что показано значением null. Это также можно сделать только для указателей и ссылок.
Если вы говорите о С++. Тогда static_cast не является безопасным типом кастинга. Он может применяться к вашему типу, но если он ошибается, он не будет вызывать никаких ошибок/сообщений. Таким образом, вы получите от этого плохой объект. И dynamic_cast бросает ошибку, если кастинг не удался:) Надеюсь, это поможет!:)