Solution (source code)

= Solution

\b[The output is `YY`, with no newline.] The variable `a` has <static type> `A`, although its <runtime type> is `B`. Both `c.m(a)` and `d.m(a)` therefore select the signature `m(A)` at compile time. The `m(B)` alternative is not applicable to an argument whose <static type> is merely `A`.

Both receivers refer to the same `D` object. <Dynamic dispatch> then invokes `D`'s override of the already selected `m(A)` signature, printing `Y` twice. The <static type> `C` of `c` changes the visible member set, but both signatures are visible through either receiver in this example. <Overload selection followed by dynamic dispatch> does not select an overload from the argument's <runtime type>.