c++ à l'aide de la déclaration, de la portée et de contrôle d'accès

Généralement l'usage de la déclaration est utilisée pour mettre en application certaines des fonctions membres des classes de base qui autrement seraient cachés. De ce point de vue, il n'est qu'un mécanisme pour assurer l'accessibilité des informations plus pratique à utiliser.
Cependant: - le "à l'aide de la" déclaration peut également être utilisé pour modifier les contraintes d'accès (pas seulement pour les fonctions, mais aussi pour les attributs). Par exemple:

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

Je pense que cette limitation de l'accès dans la classe dérivée est en fait d'aucune utilité, parce que vous pouvez toujours accéder à g() et un à partir d'un pointeur vers la classe de base. Donc devrait pas y avoir au moins une sorte d'avertissement du compilateur? Ou n'aurait-il pas été encore mieux d'interdire une telle limitation de l'accès d'une classe dérivée? L'utilisation de la déclaration n'est pas la seule possibilité d'ajouter des contraintes à l'accès. Il pourrait également être fait par le biais du remplacement d'une classe de base une fonction le plaçant dans une section avec plus de contraintes d'accès.
Certaines raisonnable exemples où il est, en effet, nessecary pour limiter l'accès dans une telle façon? Si non je ne vois pas pourquoi il devrait être permis.

Et une autre chose: au moins avec g++ le même code compile bien sans le mot 'aide'. Cela signifie que pour l'exemple ci-dessus: il est possible d'écrire des C::a; C::g; au lieu de l'aide de C::a; à l'aide de C::g; Est le premier seulement un raccourci pour le dernier ou il y a des différences subtiles?

//EDIT:
donc, à partir de la discussion et réponses ci-dessous ma conclusion serait:
- il est permis de limiter les contraintes d'accès dans les classes dérivées avec le service public de l'héritage
- il y a des exemples où il pourrait être utilisé
- c'est l'utilisation pourrait causer problème en combinaison avec des modèles (par exemple une classe dérivée n'a pas pu être un paramètre valide pour certains modèles de classe/fonction, alors que c'est la base de l'est)
- un nettoyeur de langue de conception ne doit pas permettre une telle utilisation
- compilateur pourrait au moins une sorte d'avertissement

OriginalL'auteur haselhorstk | 2010-01-18