//animals.h

#include 

//declaration of a base class (abstract)
class Animal {
  public:
    // pure virtual function -- MUST be overriden by derived class
    virtual void pinch() = 0;

    // virtual function -- MAY be overriden by derived class
    // default behavior provided if not overriden
    virtual void cry()
         {  cout<<"Do not hurt me!\n\n"; } 




};

//derived classes
class Cat : public Animal
{
  public:
    void pinch()  { cout<< "MIAOW! \n "; }

};

class Dog : public Animal
{
  public:
    void pinch()  {  cout<< "WWOOF! \n" ; }

};

class Cow : public Animal
{
  public:
    void pinch()  { cout << "MOOO! \n" ; }

};

class Tiger : public Animal
{
  public:
    void pinch()  { cout << " GRRRRRR...Tasted good!\n"; }
    void cry()     {cout  << " Who's next?" << endl << endl;}
};


//zoo.C
//test for virtual functions

#include "animals.h"

main ( )
{
  Animal *a;
  Animal *zoo[4]; 
  int i;

  Cat Felix;
  Dog Snoopy;
  Cow Liz;
  Tiger ShereKhan;

  zoo[0]=&Felix;
  zoo[1]=&Snoopy;
  zoo[2]=&Liz;
  zoo[3]=&ShereKhan;

  cout << "Welcome to the virtual zoo" << endl << endl;

//  pinch and listen to each animal separately 

//  first treating it as a pointer to Animal
	a=&Felix;
	a->pinch ( );
	a->cry ( );

//  now calling it directly as a Cat
	Felix.pinch();
	Felix.cry();

//  Same for the dog, first as a type of an Animal
	a=&Snoopy;
	a->pinch ( );
	a->cry ( );

//  Now calling it as a Dog
	Snoopy.pinch ( );
	Snoopy.cry ( );


// Just check on the other animals
// Cow
  a=&Liz;
  a->pinch ( );
  a->cry ( );


// Tiger
  a=&ShereKhan;
  a->pinch ( );
  a->cry ( );


// Now pinch all the animals in the zoo
  cout << "Now for the whole zoo at once" << endl;
  for (i=0; i<4; i++)
    zoo[i]->pinch();
    zoo[i]->cry(); 
  }
}