static_cast / dynamic_cast

Какие бывают касты и когда они нужны?...

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.

qvariant_cast