//Test mutually recursive classes, initializations, the //dot operator, and dynamic (virtual) method calls. //Correct output: // 1 // 2 // 4 // 5 // 6 // 1 // 2 // 4 // 4 // 0 // 33 class C1 extends Object { nat v1; C2 v2; Object init(nat unused) { v1 = 1024; v2 = new C2(); } //print the class to which this object belongs nat whoami(nat unused) { printNat(1); } nat testWho(C1 o) { o.whoami(0); } } class C2 extends C1 { C3 v3; Object init(nat unused) { v3 = new C3(); } nat whoami(nat unused) { printNat(2); } } class C3 extends Object { C4 v4; Object init(nat unused) { v4 = new C4(); } nat whoami(nat unused) { printNat(3); } } class C4 extends C2 { C5 v5; Object init(nat unused) { v5 = new C5(); } nat whoami(nat unused) { printNat(4); } } class C5 extends C2 { C6 v6; Object init(nat unused) { v6 = new C6(); } nat whoami(nat unused) { printNat(5); } } class C6 extends C4 { C1 v7; Object init(nat unused) { v7 = new C1(); } nat whoami(nat unused) { printNat(6); } } main { C1 c; c = new C1(); c.init(0); c.v2.init(0); c.v2.v3.init(0); c.v2.v3.v4.init(0); c.v2.v3.v4.v5.init(0); c.v2.v3.v4.v5.v6.init(0); c.v2.v3.v4.v5.v6.v7.init(0); c.v2.v3.v4.v5.v6.v7.v2.init(0); c.v2.v3.v4.v5.v6.v7.v2.v3.init(0); c.testWho(c); c.testWho(c.v2); c.testWho(c.v2.v3.v4); c.testWho(c.v2.v3.v4.v5); c.testWho(c.v2.v3.v4.v5.v6); c.testWho(c.v2.v3.v4.v5.v6.v7); c.testWho(c.v2.v3.v4.v5.v6.v7.v2); c.testWho(c.v2.v3.v4.v5.v6.v7.v2.v3.v4); c.v2.v3.v4.v5.v6.v7.v2.v3.v4.testWho(c.v2.v3.v4.v5.v6.v7.v2.v3.v4); c.v2.v3.v4.v1 = 33; printNat(c.v2.v1); printNat(c.v2.v3.v4.v1); }