c ++ mit Deklaration, Gültigkeitsbereich und Zugriffskontrolle

In der Regel wird die using-Deklaration verwendet, um einige Mitgliedsfunktionen von Basisklassen in den Geltungsbereich zu bringen, die sonst ausgeblendet würden. Unter diesem Gesichtspunkt handelt es sich lediglich um einen Mechanismus, mit dem die Verwendung zugänglicher Informationen vereinfacht wird.
Allerdings: Die 'using'-Deklaration kann auch zum Ändern von Zugriffsbeschränkungen verwendet werden (nicht nur für Funktionen, sondern auch für Attribute). Zum Beispiel:

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

Ich denke, diese Einschränkung des Zugriffs in der abgeleiteten Klasse ist eigentlich nutzlos, weil Sie immer auf g () und a von einem Zeiger auf die Basisklasse zugreifen können. Sollte es also keine Compiler-Warnung geben? Oder wäre es nicht noch besser, eine solche Einschränkung des Zugriffs durch eine abgeleitete Klasse zu verbieten? Die using-Deklaration ist nicht die einzige Möglichkeit, Zugriffsbeschränkungen hinzuzufügen. Dies kann auch durch Überschreiben einer Basisklassenfunktion und Platzieren in einem Abschnitt mit mehr Zugriffsbeschränkungen erfolgen. Gibt es vernünftige Beispiele, bei denen es tatsächlich notwendig ist, den Zugang auf diese Weise zu beschränken? Wenn nicht, verstehe ich nicht, warum es erlaubt sein sollte.

Und noch etwas: Zumindest mit g ++ lässt sich derselbe Code gut kompilieren, ohne das Wort 'using'. Das bedeutet für das obige Beispiel: Es ist möglich, C :: a zu schreiben; und C :: g; anstelle von C :: a; unter Verwendung von C :: g; Ist das erste nur eine Abkürzung für das letztere oder gibt es einige subtile Unterschiede?

//BEARBEITEN:
Aus der folgenden Diskussion und den Antworten würde ich folgendes schließen:
- Es ist erlaubt, Zugriffsbeschränkungen in abgeleiteten Klassen mit öffentlicher Vererbung zu begrenzen
- Es gibt nützliche Beispiele, wo es verwendet werden könnte
- Die Verwendung kann in Kombination mit Vorlagen zu Problemen führen (z. B. kann eine abgeleitete Klasse für einige Vorlagenklassen / -funktionen kein gültiger Parameter mehr sein, obwohl dies die Basis ist).
- Ein saubereres Sprachdesign sollte eine solche Verwendung nicht zulassen
- Der Compiler könnte zumindest eine Warnung ausgeben

Antworten auf die Frage(3)

Ihre Antwort auf die Frage