На самом деле можно скрыть только определенные элементы от базового класса, скрывая все, а затем снова скрывая только определенные (например, предоставляя закрытое переопределение):
struct Base
{
void f(int) {
printf("Base f(int)\n");
}
void f(int, int) {
printf("Base f(int, int)\n");
}
};
struct Der : Base
{
using Base::f; // unhide all f's from Base
void f(double) {
printf("Der f(double)\n");
}
// hide f(int, int) from Base by declaring it as private (no implementation needed)
private:
void f(int, int);
};
void Example() {
Der der;
der.f(1); // OK Base::f(int)
der.f(1.0f); // OK Der::f(double)
der.f(1,1); // compiler error: 'f' is a private member of 'Der'
}