open class Base { open fun f(x: T): String { return "Fail" } } abstract class Derived : Base() { abstract override fun f(x: String): String } class Implementation : Derived() { override fun f(x: String): String { return x } } fun box(): String { val base = Implementation() as Base return base.f("OK") }