#include <iostream>
using namespace std;

class X { public:                       
  virtual X& g (int a) {                  
    cout << 4 << endl; return *this; }       
  virtual void f (X& ob) { ob.g(1);          
    cout << 3 << endl; }                     
};                                                 
struct Y: X { Y() { }                                         
  Y (const Y& ob) { }                        
  Y& g (int a) {                                              
    cout << 9 << endl; return *this; }       
  virtual void f (Y& ob) { ob.g(7);     
    cout << 8 <<endl; }
};

int main() { 
   X *p = new Y();
   try { Y x, *r = &x;
         X *p = new Y();
         X().f(x); p-> f(x); r -> f(x);
         try { throw Y(); cout << 10 << endl; }
         catch (X&){cout << 11 << endl; }

         cout << 12 << endl; }
   catch (Y&)      {cout << 13 << endl; }
   cout << 14 << endl;
   delete p; return 0;
}