Разрешено ли писать экземпляр Derived поверх экземпляра Base?

Скажи код

    class Derived: public Base {....}

    Base* b_ptr = new( malloc(sizeof(Derived)) ) Base(1);
    b_ptr->f(2);
    Derived* d_ptr = new(b_ptr) Derived(3);
    b_ptr->g(4);
    d_ptr->f(5);

кажется разумным и LSP доволен.

Я подозреваю, что этот код стандартно разрешен, когда Base и Derived являются POD, и запрещен в противном случае (потому что vtbl ptr перезаписывается). Первая часть моего вопроса: пожалуйста, укажите точную предпосылку такого перезаписи.

Могут существовать другие стандартные способы перезаписи.

Вторая часть моего вопроса: есть ли другие способы? Каковы их точные предпосылки?

ОБНОВЛЕНИЕ: Я НЕ хочу писать код, подобный этому; Меня интересует теоретическая возможность (или невозможность) такого кода. Итак, это «стандартный нацистский» вопрос, а не вопрос «как я могу ...». (Мой вопрос нужно перенести на другой сайт stackoverflow?)

ОБНОВЛЕНИЕ 2 и 4: А как насчет деструкторов? Предполагаемая семантика этого кода: «Базовый экземпляр (деструктивно) обновляется с помощью фрагмента производного экземпляра». Предположим, для простоты, что у Базового класса есть тривиальный деструктор.

ОБНОВЛЕНИЕ 3: самое интересное для меня этосрок действия доступа черезb_ptr->g(4)

Ответы на вопрос(4)

Ваш ответ на вопрос