#include <cstdlib>
#include <iostream>

using namespace std;

class preSuper{
      public:
         virtual preSuper* methodVir( ) const=0;
         virtual int id( ) const=0;
};
      
      
class Super1 : public preSuper{
      
protected:
      int  v1;
      char v2;
      
public:
	
	int id( ) const {return 1;};
	preSuper* methodVir( ) const{
		return new Super1(*this);
	};
    Super1( ):v1(0), v2('a'){cout<<endl<<"In Super1 default constructor";}
    Super1(int n, char m='a'):v1(n),v2(m){cout<<endl<<"In Super1 argument constructor";}
    Super1( const Super1& S ){cout<<endl<<"In Super1 copy constructor";}
    virtual ~Super1( ){cout<<endl<<"In Super1 destructor";}            
    void methodA( const preSuper& S) const {cout<<endl<<"In Super1 methodA";}
    virtual Super1* methodB(Super1 S) const{
               cout<<endl<<"In Super1 methodB";
               return new Super1( );
               }
	   
};
  
      
class Super2 : public preSuper{      
      
      
      };
     
class SuperDeriv : public Super1 {
             
     protected:    
            double v3;
            
      public:
             SuperDeriv( ):v3(4.5){cout<<endl<<"In SuperDeriv constructor";}
             
             SuperDeriv(int n, char m='a', double o=4.5):Super1(n, m),v3(o){
                cout<<endl<<"In SuperDeriv argument constructor";
                }
                
             SuperDeriv( const SuperDeriv& S ):Super1(S){
                         cout<<endl<<"In SuperDeriv copy constructor";
                 }
             ~SuperDeriv( ){cout<<endl<<"In SuperDeriv destructor";}            
             
             void methodA( const preSuper& S) {
                  cout<<endl<<"In SuperDeriv methodA";
                  }
                  
              virtual Super1* methodB(Super1 S) const{
                     cout<<endl<<"In SuperDeriv methodB";
                     return new SuperDeriv( );
                     }
      };    


