Solution (source code)

= Solution

An ordinary call such as the unqualified `f` inside `A.g` uses <dynamic dispatch> on the receiver. Thus `c.g` enters `A.g`, but its call to `f` reaches `C.f`. In contrast, `B.h` explicitly invokes `super.f`, which continues after `B` and therefore reaches `A.f`. Finally `A.k` dynamically dispatches its call to `h`, reaching `B.h` again. The output is
``
g in A, f in C
h in B, f in A
k in A, h in B, f in A
``
Hence
$$
\boxed{g:\ A\to C,\qquad h:\ B\to A,\qquad k:\ A\to B\to A.}
$$
These arrows describe the method bodies entered in order, not the <class inheritance> relation. An inherited method continues to use the dynamic receiver for ordinary calls; it does not acquire the defining <software class> as a new receiver.