Отменить скрытие имени с помощью «quot; ключевое слово. Не работает в классе внуков

Например, в приведенной ниже программе я отменяю скрытие имени, используя ключевое слово «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

3

Решение

Вы столкнулись с особым правилом с помощью деклараций. 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)
}

конец примера ]

3

Другие решения


По вопросам рекламы [email protected]