Actually, it's very well explained in one of the "Effective C++" series.
IIRC, when calling a function, the compiler first looks at the name and only then will try to match the parameters (and choose the right function if there're multiple ones).
So, in that case, it tries to find a function with the name "func" in the Derivate class.. it finds one. Then, it tries to call it and fails because it has the wrong argument. I.e. It won't look at the Base class since it already found a function with the right name.
TL;DR: First = search by name, Second = Match parameters.
IIRC, when calling a function, the compiler first looks at the name and only then will try to match the parameters (and choose the right function if there're multiple ones).
So, in that case, it tries to find a function with the name "func" in the Derivate class.. it finds one. Then, it tries to call it and fails because it has the wrong argument. I.e. It won't look at the Base class since it already found a function with the right name.
TL;DR: First = search by name, Second = Match parameters.