/*****************************************************/
// INHERIT2
// Original author: David Schwartz, dis@cs.cornell.edu
// Updated by: Kiri Wagstaff, wkiri@cs.cornell.edu
// The following code demonstrates how a subclass
// defines constructors.

class C {
    public int x, y=10;
    public C(int x)  { 
	    this.x = x;
	    System.out.println("x (C): "+x);
	    System.out.println("y (C): "+y);	
    }
}

class D extends C
{ 
    public int z=100;
    public D(int x) 
    {
	    super(x-1);
	    System.out.println("x (D): "+x);
	    System.out.println("y (D): "+y);	
	    System.out.println("z (D): "+z);	
    }
}

public class Inherit2 
{
    public static void main(String[] args)
    {
    	// This creates a C object
			System.out.println("\nTest 1:");
			C v1 = new C(2);
			System.out.println("v1 uses "+v1.getClass());
			System.out.println("accessing x: "+v1.x); 

			// This creates a D object
			System.out.println("\nTest 2:");
			D v2 = new D(2);
			System.out.println("v2 uses "+v2.getClass());
			System.out.println("accessing x: "+v2.x); 

			// Even if we store a D in a C variable,
			// D still gets printed out as a D
			System.out.println("\nTest 3:");
			C v3 = new D(2);
			System.out.println("v3 uses "+v3.getClass());
			System.out.println("accessing x: "+v3.x); 
			
			// But we cannot store a C object in a D variable
			// D v4 = new C(2);
    }
}

/* sample output:
Test 1:           Test 2:						Test 3:         
x (C): 2					x (C): 1	 				x (C): 1        
x (C): 10					y (C): 10	 				y (C): 10       
									x (D): 2					x (D): 2        
									y (D): 10					y (D): 10       
									z (D): 100	  		z (D): 100      
v1 uses class C		v2 uses class D	  v3 uses class D
accessing x: 2		accessing x: 1	  accessing x: 1  
*/







