Override of protocol default implementation in a subsubclass doesn't participate in dynamic dispatch
<p>Consider following playground:</p>

<pre><code>protocol A {
    func f() -&gt; String
}

extension A {
    func f() -&gt; String { return "AAAA" }
}

class B: A {}

class C: B {
    func f() -&gt; String { return "CCCC" }
}

let a: A = C()
let b: B = C()
let c: C = C()

a.f() // "AAAA" - why?
b.f() // "AAAA" - why?
c.f() // "CCCC"
</code></pre>

<p>I don't get why <code>a.f()</code> and <code>b.f()</code> return <code>"AAAA"</code> - they are supposed to return <code>"CCCC"</code> because <code>func f() -&gt; String</code> should be dynamically dispatched (as it declared in protocol).</p>

<p>If I change <code>class B</code> to look like this:</p>

<pre><code>class B: A {
    func f() -&gt; String { return "BBBB" }
}
</code></pre>

<p>then all three calls to <code>.f()</code> return <code>"CCCC"</code> as expected.</p>

<p>I feel like it is a bug in Swift compiler, I checked in Xcode 7.3.1 and 8.0-beta3, this behavior is reproducible in both.</p>

<p>Is this actually an expected behavior?</p>