Как сказано в другом: стандарт так говорит.
Так почему же в стандарте так сказано?
Потому что если тип не полиморфный, он может (или является? Вопросом к стандартным гуру) быть простым типом. А для простых типов есть много предположений, вытекающих из обратной совместимости с C.
Одним из них является то, что тип состоит только из его членов, поскольку разработчик объявил + необходимые байты выравнивания. Поэтому не может быть никаких дополнительных (скрытых) полей.
Таким образом, нет способа сохранить в памяти, сохраненной A, информацию о том, что это действительно B.
Это возможно только тогда, когда это полиморфно, так как тогда разрешено добавлять такие скрытые вещи.
(В большинстве реализаций это делается через vtable).