Какие бывают касты и когда они нужны?...
static_cast
static_cast это про приведение простых типов данных друг к другу.
Например enum к int, float к enum.
dynamic_cast
dynamic_cast работает с указателями и ссылками.
Нужен для проверки : (например) является ли указатель на некий класс потомком некого базового класса.
Допустим такую иерархию классов:
А->B->C
B* pb = dynamic_cast(pc)
Получаем из указателя С указатель на B.
Есть один нюанс, чтобы из указателя B получить в обратную сторону указатель на C надо класс A сделать виртуальным, то есть достаточно добавить одну виртуальную функцию в класс А.
const_cast
const_cast используют для того, чтобы отбросить квалификатор const у изначально не константных данных или добавить квалификатор const.
reinterpret_cast
Приведение типов без проверки. reinterpret_cast — непосредственное указание компилятору. Применяется только в случае полной уверенности программиста в собственных действиях. Не снимает константность и volatile. применяется для приведения указателя к указателю, указателя к целому и наоборот.
C-style cast
Си-шный метод приведения типов. Пожалуй самый нежелательный способ приведения типов.
qobject_cast
Приводит объект QObject* к типу TYPE если объект типа объекта TYPE или тип наследует от TYPE иначе возвращает 0. qobject_cast от 0 также дает 0. Необходимое условие. Класс должен наследовать от QObject и содержать в себе макрос Q_OBJECT. Функция ведет себя аналогично стандартному dynamic_cast, но при этом не использует RTTI.