Operator== in derived class never gets called-Collection of common programming errors

Can someone please put me out of my misery with this? I’m trying to figure out why a derived operator== never gets called in a loop. To simplify the example, here’s my Base and Derived class:

class Base { // ... snipped
  bool operator==( const Base& other ) const { return name_ == other.name_; }
};

class Derived : public Base { // ... snipped
  bool operator==( const Derived& other ) const { 
    return ( static_cast( *this ) ==
             static_cast( other ) ? age_ == other.age_ :
                                                 false );
};

Now when I instantiate and compare like this …

Derived p1("Sarah", 42);
Derived p2("Sarah", 42);
bool z = ( p1 == p2 );

… all is fine. Here the operator== from Derived gets called, but when I loop over a list, comparing items in a list of pointers to Base objects …

list coll;

coll.push_back( new Base("fred") );
coll.push_back( new Derived("sarah", 42) );
// ... snipped

// Get two items from the list.
Base& obj1 = **itr;
Base& obj2 = **itr2;

cout