class BaseList {
protected:
  std::list<Base*>  list_;
public:
  class iterator {
    std::list<Base*>::iterator  base_;
  public:
    iterator(std::list<Base*>::iterator i) : base_(i) {}
    Base* operator*(){ return *base_; }
  };
  iterator begin() { return iterator(list_.begin()); }
};

class DerivedList : public BaseList {
public:
  class iterator : public BaseList::iterator {
  public:
    iterator(std::list<Base*>::iterator i) : BaseList::iterator(i) {}
    Derived* operator*(){ return static_cast<Derived*>(BaseList::iterator::operator*()); }
  };
  iterator begin() { return iterator(list_.begin()); }
};

うーん…