Я уверен, что видел этот случай, предложенный Сиги, но не уверен, что:
struct Base {
void f(const Base&);
};
struct Derived : Base {
using Base::f;
void f(double);
};
int main() {
Derived d;
d.f('a'); // calls Derived::f
}
Теперь добавьте void f(int);
к Base
и значение основных изменений - оно вызывает Base::f
, потому что int
лучше подходит для char
- это целочисленное продвижение, а не стандартное преобразование.
Не ясно, действительно ли это изменение базы будет предназначенным для программистом для перехвата вызовов с char
, поэтому требование явного using
означает, что поведение по умолчанию состоит в том, что изменение не не влияет на код вызова. Я считаю, что это маргинальный вызов, но я думаю, что комитет решил, что базовые классы в C ++ были достаточно хрупкими, без них тоже: -)
Нет необходимости в ключевом слове «скрывать», потому что нет сопоставимого случая для сокрытия «f» от базы, когда оно не перегружено в производном.
Кстати, я выбрал типы, а char
намеренно неуместен. Вы можете получить более тонкие случаи с int
против unsigned int
вместо int
против char
.