open class A { open fun foo(t: T) = "A" } open class B : A() open class C : B() { override fun foo(t: String) = "C" } open class D : C() class Z : D() { override fun foo(t: String) = "Z" } fun box(): String { val z = Z() val d: D = z val c: C = z val b: B = z val a: A = z return when { z.foo("") != "Z" -> "Fail #1" d.foo("") != "Z" -> "Fail #2" c.foo("") != "Z" -> "Fail #3" b.foo("") != "Z" -> "Fail #4" a.foo("") != "Z" -> "Fail #5" else -> "OK" } }