// Listing 12.9 Multiple virtual functions called in turn #include using namespace std; class Mammal { public: Mammal():itsAge(1) { } ~Mammal() { } virtual void Speak() const { cout << "Mammal speak!\n"; } protected: int itsAge; }; class Dog : public Mammal { public: void Speak()const { cout << "Woof!\n"; } }; class Cat : public Mammal { public: void Speak()const { cout << "Meow!\n"; } }; class Horse : public Mammal { public: void Speak()const { cout << "Winnie!\n"; } }; class Pig : public Mammal { public: void Speak()const { cout << "Oink!\n"; } }; int main() { Mammal* theArray[5]; Mammal* ptr; int choice = 0; int i = 0; for ( i = 0; i < 5; i++) { cout << "(1)dog (2)cat (3)horse (4)pig: "; cin >> choice; switch (choice) { // Speak() outputs case 1: ptr = new Dog; // Woof! break; case 2: ptr = new Cat; // Meow! break; case 3: ptr = new Horse; // Winnie! break; case 4: ptr = new Pig; // Oink! break; default: ptr = new Mammal; // Mammal speak! break; } theArray[i] = ptr; } for (i = 0; i < 5; i++) { theArray[i]->Speak(); } return 0; }