class Super {
	String f() {return "Hi from Super.f";}
}

class Sub extends Super {
	String f() {return "Hi from Sub.f";}
}

class Sub2 extends Super {
	String f() {return "Hi from Sub2.f";}
}

class Overrider {
	public static void main(String [] args) {
		Super sup = new Super();
		System.out.println("sup->Super: " + sup.f());
		Sub sub = new Sub();
		System.out.println("sub->Sub: " + sub.f());

		sup = new Sub();
		System.out.println("sup->Sub: " + sup.f());

		sub = (Sub)sup;
		System.out.println("sub->Sub: " + sub.f());
		
		sup = sub;
		System.out.println("sup->Sub: " + sup.f());

		sub = (Sub)new Sub2();
		
	}
}