web-dev-qa-db-fra.com

accéder aux membres privés en héritage

J'ai une classe A, qui a un champ val déclaré privé. Je veux déclarer une classe B, qui hérite de A et a accès à val. Existe-t-il un moyen de le faire en C++?

Je veux le faire car j'ai besoin de surcharger certaines fonctions de A, sans changer du tout le code A.

Merci.

26
ofer

Réponse rapide: non. C'est à cela que sert le mot clé protected, que vous souhaitez utiliser si vous souhaitez accorder l'accès aux sous-classes mais à personne d'autre.

private signifie que personne n'a accès à ces variables, pas même aux sous-classes.

Si vous ne pouvez pas du tout modifier le code dans A, il existe peut-être une méthode d'accès public/protected pour cette variable. Sinon, ces variables ne sont pas censées être accessibles à partir de sous-classes et seuls les hacks peuvent aider (ce que je n'encourage pas!).

45
Constantinius

Membres privés d'une classe de base n'est accessible que par les fonctions membres de base (pas les classes dérivées). Vous n'avez donc aucun droit, même pas la possibilité de le faire :)

class Base

  • public: accessible à tous
  • privé: uniquement accessible par les fonctions membres de base (pas les classes dérivées)
  • protégé: accessible à la fois par les fonctions membres de base et les classes dérivées
16
Schehaider Aymen

Eh bien, si vous avez accès à la classe de base, vous pouvez déclarer la classe B comme classe amie . Mais comme d'autres l'ont expliqué: parce que vous le pouvez, cela ne signifie pas que c'est une bonne idée. Utilisez des membres protégés si vous souhaitez que les classes dérivées puissent y accéder.

8
dbrank0

C'est faisable comme décrit dans ce gourou de la semaine - GotW # 76 - Usages et abus des droits d'accès . Mais cela devrait être considéré comme un dernier recours.

3
Eoin

Vous devez le définir comme protected. Les membres protégés sont hérités des classes enfants mais ne sont pas accessibles depuis le monde extérieur.

1
Meysam