class Base {
public:
  void bar(int, int) {}
};

class Test : public Base {
public:
  void foo() { Base::bar(1,2); }
  void abar(int, int) {}
  void bbar(int, int) {}
};

class Derived : public Test {
  void abar(int, int) {}
};

class OtherDerived : public Base {
public:
  Test *make () { return new Test; }
  void destroy (Test *obj) { delete obj; }
};

Test array[10];

int main()
 {
   Test local_array[5];    // five instances of "Test"
   Derived test;           // one instance of "Test"
   
   test.foo();             // some work
   
   OtherDerived od;        // no instance of "Test"
   od.bar (3, 4);          // some more work

   Test *obj = od.make (); // this creates one "Test" instance
   od.destroy (obj);       // here it is destroyed again

   return 0;               // automatic destruction of six instances
 }

