Russian Qt Forum
Май 01, 2024, 22:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: static_cast или dinamic_cast ?  (Прочитано 8235 раз)
itan
Гость
« : Апрель 06, 2006, 14:20 »

Объясните популярно, в каких случаях какое преобразование типов необходимо использовать?
Записан
Вудруф
Гость
« Ответ #1 : Апрель 07, 2006, 06:22 »

static_cast - преобразование на этапе компиляции
dynamic_cast - преобразование на этапе исполнения

Второй нужно использовать, если ты преобразовываешь указатель на базовый класс к указателю на потомка. В таком случае преобразование будет выполняться на этапе исполнения, в случае невозможности приведения будет сгенерировано исключение.
Записан
itan
Гость
« Ответ #2 : Апрель 07, 2006, 10:43 »

Цитировать

Второй нужно использовать, если ты преобразовываешь указатель на базовый класс к указателю на потомка.

Преобразовать указатель на базовый класс к указателю на потомка можно и с помощью static_cast, просто вместо исключения будем получать сообщение об ошибке во время компиляции.
Получается, что если я хочу проверять правильность всех преобразований на этапе компиляции, мне можно забыть про dynamic_cast и использовать вместо него static_cast ? Больше разницы никакой?
Записан
Вудруф
Гость
« Ответ #3 : Апрель 07, 2006, 11:21 »

Э... нет. Тут ты не прав. Если у нас есть какой-то указатель на базовый класс, потом мы с ним что-то делаем, а потом пытаемся преобразовать к указателю на потомка, то мы не сможем на этапе компиляции определить правильность этого преобразования. А вот на этапе исполнения - можем, ибо есть RTTI (определение типа во время исполнения). Если преобразование может совершиться, оно совершится. Если оно не возможно - получим исключение.
Записан
itan
Гость
« Ответ #4 : Апрель 07, 2006, 14:21 »

Понятно, т.е. dynamic_cast защищает от небезопасного преобразования, такого как это:

Код:

class B {...};
class D : public B {...};

void  f()
{
   B* pb = new B;
   D* pd = dynamic_cast<D*>(pb);
}


Правда, если класс B не содержит виртуальных функций, то выдается ошибка "error C2683: dynamic_cast : 'B' is not a polymorphic type" (MSVC 2003)

Цитировать
dynamic_cast : 'type' is not a polymorphic type

You cannot use dynamic_cast to convert from a non-polymorphic class (a class with no virtual functions).

You can use static_cast to perform conversions of non-polymorphic types. However, static_cast does not perform a run-time check.



Почему такое происходит?
Записан
Вудруф
Гость
« Ответ #5 : Апрель 10, 2006, 07:23 »

См. Страуструпа. Главу 15.4.1.

Однако, процитирую:
A dynamic_cast requires a pointer or a reference to a polymorphic type to do a downcast or a crosscast.
Requiring the pointer’s type to be polymorphic simplifies the implementation of dynamic_cast because it makes it easy to find a place to hold the necessary information about the object’s type. A typical implementation will attach a ‘‘type information object’’ to an object by placing a pointer to the type information in the object’s virtual function table. ... It is clear that dynamic_cast can be efficiently implemented.
All that is involved are a few comparisons of type_info objects representing base classes; no expensive lookups or string comparisons are needed.
Restricting dynamic_cast to polymorphic types also makes sense from a logical point of view. This is, if an object has no virtual functions, it cannot safely be manipulated without knowledge of its exact type. Consequently, care should be taken not to get such an object into a context in which its type isn’t known. If its type is known, we don’t need to use dynamic_cast.

P.S. Кстати, выше я ошибся. bad_cast будет сгенерировано только при преобразовании ссылки, при преобразовании указателя при неудаче возвращается 0. См. главу 15.4.1.1
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.