Hmm, then maybe I don't understand polymorphism like I thought I did (which is always a possibility!). I thought the purpose of arrays of base class pointers is so they can store objects of the derived types, and the functions of the derived types will be called -- the example I always hear of is an array of screen objects, each with its own draw method.
"and it still treated the members of ptrArray as ABC type, not derived types."
That's the whole point of polymorphism: you can use pointers to base class objects to point to derived class objects. If you don't need polymorphic behaviour, why not just dynamically create an array of pointers to Derived1 or Derived2 objects?