Как вы уже могли заметить, указатель базового класса, такой как
*p фигуры shape, может указывать не только на объект shape, но также
и на объект circle. Это делается без указания типа. Фактически, вы
можете использовать базовый указатель класса, для указания на любой
порожденный объект. Например, *p может указывать на rect, на box3d,
на cylinder и так далее. Вот такие возможности заложены в указателях.
Однако, преобразование неверно. Например, указатель круга circle
не может указывать на объект shape. Почему? Потому что радиус radius
круга отсутствует у фигуры shape. Так если вы попытались сделать из
фигуры круг, без радиуса, то вероятно будет ошибка.