Usa dynamic_pointer_cast<>
codice:
  for (list<spBase_t>::iterator i = l.begin(); i!= l.end(); i++)
  {
    spDerived_t sd = dynamic_pointer_cast<Derived>(*i);
    sd->print();
  }
Oppure

codice:
  for (list<spBase_t>::iterator i = l.begin(); i!= l.end(); i++)
  {
       dynamic_pointer_cast<Derived>(*i)->print();
  }
Se però il nuovo puntatore è nullo, hai un errore di accesso.