The compiler detects ambiguities by performing tests in this order:
  1. If access to the name is ambiguous, an error message is generated.
  2. If overloaded functions are unambiguous, they are resolved.
  3. If access to the name violates member-access permission, an error message is generated.

The names are checked before the access permission.

You can get rid of it by using:
Code:
Derived d;
int i = d.Base1::myFunc();