Прежде всего, не используйте броски в стиле C для снижения (или вообще никакого каста).Это очень опасно, потому что обходит все проверки компилятора.
Тем не менее, вам не нужно беспокоиться о нарезке, когда вы понижаете ссылки или указатели.
Для полиморфных объектов (т.е. объектов, которые имеютвиртуальные методы) вы можете использовать динамическое приведение, которое дает вам проверку времени компиляции + выполнения (возвращает ноль при понижении указателя на неправильный тип или выдает исключение bad_cast при понижении ссылки на неверный тип):
Block & block = dynamic_cast<Block&>(obj);
Для неполиморфных объектов вы можете использовать static_cast
.