Например, в приведенной ниже программе я отменяю скрытие имени, используя ключевое слово «using». Если у меня есть базовый и один производный класс, я получаю ожидаемую неоднозначную ошибку вызова. Но если у меня есть два производных класса (child и grand child), теперь child и grand child, имеющие одну и ту же перегруженную функцию, я отменяю скрытие имени, используя ключевое слово «using». Но это скомпилировано и получено. Мой вопрос, почему я не получаю ошибку как «неоднозначный вызов перегруженной функции».
class baseNameHiding
{
protected:
int nameHidingexample(int t)
{
cout<<"im baseeeeeeeeeeee"<<endl;
return 0;
}
};
class derivedNameHiding:public baseNameHiding
{
public:
float nameHidingexample(float s)
{
cout<<"im derived"<<endl;
return 0;
}
using baseNameHiding::nameHidingexample;
};
class grandDerivedNameHiding:public derivedNameHiding
{
public:
float nameHidingexample(float f)
{
cout<<"im grand derived"<<endl;
return 0;
}
using baseNameHiding::nameHidingexample;
using derivedNameHiding::nameHidingexample;
};
int main()
{
char a;float f = 0.0;
derivedNameHiding derived;
derived.nameHidingexample(0);
grandDerivedNameHiding grandchild;
grandchild.nameHidingexample(f);
cin>>a;
}//output
im baseeeeeeeeeeee
im grand derived
Вы столкнулись с особым правилом с помощью деклараций. C ++ 14 [namespace.udecl] / 15:
Когда используя декларирование приносит имена из базового класса в
область производного класса, функции-члены и шаблоны функций-членов в
производный класс переопределяет и / или скрывает функции-члены
шаблоны функций с тем же именем, Параметр типа-лист,
резюме квалификация, а также реф-классификатор (если таковые имеются) в базовом классе (а не конфликтующие). […] [ Пример:struct B { virtual void f(int); virtual void f(char); void g(int); void h(int); }; struct D : B { using B::f; void f(int); // OK: D::f(int) overrides B::f(int); using B::g; void g(char); // OK using B::h; void h(int); // OK: D::h(int) hides B::h(int) }; void k(D* p) { p->f(1); // calls D::f(int) p->f(’a’); // calls B::f(char) p->g(1); // calls B::g(int) p->g(’a’); // calls D::g(char) }
— конец примера ]