abstract class A { abstract fun doStuffWithOther(other: A) protected fun sayHi() { println("hi!") } } class B : A() { override fun doStuffWithOther(other: A) { sayHi() // this compiles other.sayHi() // this is angry } } fun main(args: Array) { B().doStuffWithOther(B()) }