Обычно объявление 'using' используется для включения в область действия некоторых функций-членов базовых классов, которые в противном случае были бы скрыты.С этой точки зрения это всего лишь механизм, позволяющий сделать доступную информацию более удобной для использования.
Однако: объявление «использование» также может использоваться для изменения ограничений доступа (не только для функций, но и для атрибутов).Например:
class C{
public:
int a;
void g(){ cout << "C:g()\n"; }
C() : a(0){}
};
class D : public C{
private:
using C::a;
using C::g;
public:
D() { a = 1; }
};
int main(void){
D d;
cout << d.a << endl; //error: a is inaccessible
C *cp = &d;
cout << cp->a << endl; //works
d.g(); //error: g is inaccessible
cp->g(); //works
return 0;
}
Я думаю, что это ограничение доступа в производном классе на самом деле бесполезно, потому что вы всегда можете получить доступ к g () и a из указателя на базовый класс.Так не должно ли быть хоть какое-то предупреждение компилятора?Или было бы еще лучше запретить такое ограничение доступа производным классом?Объявление using - не единственная возможность добавить ограничения для доступа.Это также можно сделать путем переопределения функции базового класса и помещения ее в раздел с большим количеством ограничений доступа.Есть ли разумные примеры, когда действительно необходимо ограничивать доступ таким способом?Если нет, я не понимаю, почему это должно быть разрешено.
И еще: по крайней мере с g ++ один и тот же код хорошо компилируется без слова 'using'.Это означает, что для примера выше: можно написать C :: a;и C :: g;вместо использования C :: a;используя C :: g;Первый только ярлык для последнего или есть некоторые тонкие различия?
// РЕДАКТИРОВАТЬ:
поэтому из обсуждения и ответов ниже мой вывод будет:
- разрешено ограничивать ограничения доступа в производных классах с публичным наследованием
- есть полезные примеры, гдеего можно использовать
- его использование может вызвать проблемы в сочетании с шаблонами (например, производный класс больше не может быть допустимым параметром для какого-либо класса / функции шаблона, хотя он является базовым)
- более чистый языковой дизайн долженне разрешать такое использование
- компилятор может по крайней мере выдать какое-то предупреждение