#include #include using namespace std; class StringDoer { public: virtual void f(string) = 0; }; class StringSet { // no superclass unlike in homework public: StringSet(); virtual ~StringSet(); bool member(string); void add(string); void foreach(StringDoer*); private: int num_elts; int array_size; string * array; }; void StringSet::foreach(StringDoer * d) { for(int i=0; i < num_elts; ++i) d->f(array[i]); } // works great, different clients can provide different subclasses // of StringDoer with fields (and extra methods) of any type they want // Simple example: class StringLengthSummer: public StringDoer { public: StringLengthSummer() : sofar(0) {} virtual ~StringLengthSummer() {} virtual void f(string s) { sofar += s.length(); } virtual int getSum() { return sofar; } private: int sofar; }; int length_summer(StringSet * set) { StringLengthSummer * d = new StringLengthSummer(); set->foreach(d); // upcast! int ans = d->getSum(); delete d; return ans; }