Потому что А *а это указатель и он хранить только адрес выделенной памяти, а память вы выделяете под экземпляр структуры B.
Далее вы его явно приводите к B *, и после разыменования работаете с экземпляром B.
Компилятор выделяет под new A память для хранения всех производных классов
Нет догадка неверна, да и в коде у вас new B(2).