Forse l'esempio era meno analogo di quello che tu possa pensare. Sarebbe bene che postassi l'esempio. Cmq... cosa fa poligono *p; p = new quadrato(100); ? crea un puntatore del tipo poligono e alloca tanta memoria quanto indicato da quadrato(). Tutto qua ed e' proprio questo il comportamento che deve assumere il programma. Non e' che il puntatore e' stato 'magicamente castato al tipo desiderato'. Usa il polimorfismo, e' molto meglio .

bye