• Как работает static cast?

    @MiiNiPaa
    Пытается произвести преобразование используя определённые операторы преобразования и конструкторы. Если подобного преобразования нет, выдаст ошибку.

    С указателями на классы связанные отношением наследования всё несколько сложнее:

    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);
    Ответ написан
    4 комментария