Пытается произвести преобразование используя определённые операторы преобразования и конструкторы. Если подобного преобразования нет, выдаст ошибку.
С указателями на классы связанные отношением наследования всё несколько сложнее:
1) Преобразование указателя на дочерний класс в указатель на базовый.
static_cast безопасно приводит типы: возвращаемое значение — указатель на базовый субобъект дочернего класса.
2) Преобразование указателя на базовый класс в указатель на дочерний.
Преобразование всегда успешно (нет ошибки компиляции). Если базовый указатель указывает на субобъект дочернего класса, приведение успешно и безопасно. Если базовый указатель
не указывает на субобъект дочернего класса, то результат приведения не определён и может случится что угодно.
struct base
{};
struct derived: base
{};
//...
derived* d = new derived;
//Работает, безопасно
base* b = static_cast<base*>(d);
//Работает, безопасно так как b на самом деле указывает на derived
d = static_cast<derived*>(b);
b = new base;
//Undefined Behavior. Программа превращается в тыкву.
d = static_cast<derived*>(b);