new (&a) AB(); // everything works here except virtuals
Это на самом деле не работает: поведение здесь не определено. a
- это объект типа AA
. Вы не можете построить объект типа AB
на его месте. Единственный объект, который вам разрешено построить, это AA
объект.
Если вам нужно полиморфное поведение для a
, вы должны использовать указатель на динамически размещенный объект. Предпочтительно, умный указатель на динамически размещенный объект, например, std::unique_ptr<AA>
. Также обратите внимание, что AA
должен иметь виртуальный деструктор.