c ++ używa deklaracji, zakresu i kontroli dostępu

Zazwyczaj deklaracja 'using' jest używana do wprowadzenia do zakresu niektórych funkcji składowych klas bazowych, które w przeciwnym razie byłyby ukryte. Z tego punktu widzenia jest to tylko mechanizm ułatwiający korzystanie z dostępnych informacji.
Jednakże: deklaracja 'using' może być również używana do zmiany ograniczeń dostępu (nie tylko dla funkcji, ale także dla atrybutów). Na przykład:

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;
}

Myślę, że to ograniczenie dostępu w klasie pochodnej jest w rzeczywistości bezużyteczne, ponieważ zawsze można uzyskać dostęp do g () i od wskaźnika do klasy bazowej. Czy nie powinno być przynajmniej jakiegoś ostrzeżenia kompilatora? Czy może lepiej byłoby zakazać takiego ograniczenia dostępu klasie pochodnej? Deklaracja użycia nie jest jedyną możliwością dodania ograniczeń dostępu. Można to również zrobić poprzez nadpisanie funkcji klasy bazowej i umieszczenie jej w sekcji z większymi ograniczeniami dostępu. Czy istnieją jakieś rozsądne przykłady, gdzie rzeczywiście nie ma potrzeby ograniczania dostępu w taki sposób? Jeśli nie, nie widzę powodu, dla którego miałoby to być dozwolone.

I jeszcze jedno: przynajmniej z g ++ ten sam kod dobrze się kompiluje bez słowa „używanie”. Oznacza to, że w powyższym przykładzie można napisać C :: a; i C :: g; zamiast używać C :: a; przy użyciu C :: g; Czy jest to tylko pierwszy skrót do tego drugiego, czy są jakieś subtelne różnice?

//EDYTOWAĆ:
więc z dyskusji i odpowiedzi poniżej mój wniosek byłby:
- dozwolone jest ograniczenie ograniczeń dostępu w klasach pochodnych z dziedziczeniem publicznym
- istnieją przydatne przykłady, w których można je wykorzystać
- jego użycie może powodować problemy w połączeniu z szablonami (np. klasa pochodna nie może już być poprawnym parametrem dla jakiejś klasy / funkcji szablonu, chociaż jest to podstawa)
- czystszy projekt językowy nie powinien pozwalać na takie użycie
- kompilator może przynajmniej wydać jakieś ostrzeżenie

questionAnswers(3)

yourAnswerToTheQuestion