open class X: A() { override fun foo(x: Int): String? { return super.foo(1) + 1 } } open class Y: B() { override fun foo(x: Int): String? { return s.length * 2 } } open class Z: X() { override fun foo(x: Int): String? { return s.length } } fun test() { A().foo(1) B().foo(1) X().foo(1) Y().foo(1) Z().foo(1) }