C ++ с использованием декларации, области видимости и контроля доступа

Обычно объявление 'using' используется для того, чтобы ввести в область действия некоторые функции-члены базовых классов, которые в противном случае были бы скрыты. С этой точки зрения это всего лишь механизм, позволяющий сделать доступную информацию более удобной в использовании.
Тем не менее, объявление «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 ++ тот же код хорошо компилируется без слова «использование». Это означает, что для примера выше: можно написать C :: a; и C :: g; вместо использования C :: a; используя C :: g; Первый только ярлык для последнего или есть некоторые тонкие различия?

//РЕДАКТИРОВАТЬ:
поэтому из обсуждения и ответов ниже мой вывод будет:
- разрешено ограничивать ограничения доступа в производных классах с публичным наследованием
- есть полезные примеры, где это можно использовать
- его использование может вызвать проблемы в сочетании с шаблонами (например, производный класс больше не может быть допустимым параметром для некоторого класса / функции шаблона, хотя его база является)
- более чистый языковой дизайн не должен допускать такого использования
- компилятор может по крайней мере выдать какое-то предупреждение

Ответы на вопрос(3)

Ваш ответ на вопрос