Вы не должны связываться с не POD-типами.В частности, стандарт C ++ гласит, что memcpy
использование не POD приводит к неопределенному поведению, которое, в вашем случае, показывает, что продолжает видеть a
как тип A
.
В вашемВ конкретном случае компилятор «знает», что и «статический тип», и «динамический тип» a
равны A
(поскольку его тип не может «законно» измениться - ваш трюк недопустим), поэтомувиртуальная диспетчеризация выполняется, но a.foo()
вызывается напрямую (и ваш трюк с перезаписью vptr, таким образом, не действует).