//Listing 14.10 Pointers to member functions using virtual methods #include using namespace std; class Mammal { public: Mammal():itsAge(1) { } ~Mammal() { } virtual void speak() const = 0; virtual void move() const = 0; protected: int itsAge; }; class Dog : public Mammal { public: void speak()const { cout << "Woof!\n"; } void move() const { cout << "Walking to heel...\n"; } }; class Cat : public Mammal { public: void speak() const { cout << "Meow!\n"; } void move() const { cout << "slinking...\n"; } }; class Horse : public Mammal { public: void speak()const { cout << "Winnie!\n"; } void move() const { cout << "Galloping...\n"; } }; int main() { void (Mammal::*pFunc)() const = 0; Mammal* ptr = 0; int animal; int method; bool fQuit = false; while (!fQuit) { cout << "(0)Quit (1)dog (2)cat (3)horse: "; cin >> animal; switch (animal) { case 1: ptr = new Dog; break; case 2: ptr = new Cat; break; case 3: ptr = new Horse; break; default: fQuit = true; break; } if (fQuit) { break; } cout << "(1)speak (2)move: "; cin >> method; switch (method) { case 1: pFunc = &Mammal::speak; break; default: pFunc = &Mammal::move; break; } (ptr->*pFunc)(); delete ptr; } return 0; }