Upcasts (к указателю на базу) не требует явного приведения в C ++.
С другой стороны, boost::any_cast
будет успешным только при приведении к тому же типу, который был изначально сохранен. (IIRC использует typeid для проверки того, что вы пытаетесь получить доступ к правильному типу, а сравнение typeid верно только для точных совпадений.)
Таким образом:
A* aa = boost::any_cast<B*>(any);
Тем не менее, неясно, почему вы должны использовать boost::any
для полиморфных типов. В частности, он не является умным указателем и не удалит сохраненный объект. Более распространенным является хранение указателей на полиморфный объект в интеллектуальном указателе, например boost::shared_ptr<A>