import kotlin.reflect.KMemberProperty trait Base { val x: Any } class A : Base { override val x: String = "" } open class B : Base { override val x: Number = 1.0 } class C : B() { override val x: Int = 42 } fun test() { val base = Base::x base : KMemberProperty base.get(A()) : Any base.get(B()) : Number base.get(C()) : Int val a = A::x a : KMemberProperty a.get(A()) : String a.get(B()) : Number val b = B::x b : KMemberProperty b.get(C()) : Int }