Changer le mode d'accès des membres et méthodes d'une classe héritée [Résolu]

Signaler
Messages postés
15
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2009
-
Messages postés
3809
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
22 avril 2020
-
Bonjour,

je cherche à changer le mode d'accès (public, protected, private) des membres et méthodes d'une classe héritée mais je ne sais pas si c'est possible ni comment faire. Evidement je veux changer les accès public en protected ou private et les accès protected en private. Je suis pas du tout sur de moi mais j'avais cru lire (il y a un bon moment maintenant) que ça serait possible avec la nouvelle révision du C++ (dont je n'ai pas trop entendu parler). Merci d'avance pour vos réponses.

5 réponses

Messages postés
15
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2009

Bonsoir et merci pour vos réponses,

j'avoue l'autre jour j'ai posté ce message en espérant que quelqu'un me réponde avant que je trouve se que je voulais (j'étais pris par le temps fête de la musique oblige)... Mais je me rattrappe et apporte la solution !

@CptPingu : c'est se que je fais actuellement et je trouve cette méthode lourde à force... Pour l'intérêt je m'en sers pour des classes de bases génériques (1) dont les classes filles (2) peuvent accéder aux membres directement mais ne permettent pas forcément à leurs classes filles (3) d'accéder aux membres mais tout de même à certaines méthodes de la classe mère (1)... Sans avoir à utiliser massivement de friend (qui authorise l'accès à tous les membres et méthodes) !

Un petit exemple qui montre se que je voulais faire :

class Mere {
    public : // Pour l'exemple je vais tout mettre en public.
        int a;
        int b;

        void Print() const { printf("a : %i   b : %i", a, b); }
};

class Fille : public Mere {
    // Les classes filles à 'Fille' ne pourront plus accéder à 'a' mais pourront accéder à 'b'.
    // Les utilisateurs hors de la classe 'Fille' ne pourront accéder ni à 'a' ni à 'b' mais pourront appeler la méthode Print.
    private :
        using Mere::a;

    protected :
        using Mere::b;
};
Messages postés
3809
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
22 avril 2020
105
Ce n'est pas possible.
En revanche tu peux bidouiller pour obtenir un tel résultat.
Tu encapsules la classe au lieu d'en hériter (avec utilisation du mot clé friend si nécessaire), et tu réécris les mêmes méthodes qui appellent ce qu'il faut. Ces méthodes auront la visibilité voulue.

Il ne me semble pas que le C++ 0.X implémente ceci.

En revanche, je ne vois pas pourquoi tu veux réaliser ce genre de chose, c'est assez illogique. Si tu hérites d'un objet, tu hérites de ses propriétés. Donc si un chat peut miauler(), il est un peu étrange de dire qu'un chat_noir qui hérite de chat, lui, ne pourrais pas.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
bien sûr que c'est possible :
(ou alors j'ai pas compris ce que tu voulais)

class Base {public: int a;};

class Deriv : protected A{};

et 'a' sera d'accès protected dans les classe Deriv.

voici l'ensemble des choses que tu peux faire :

héritage: public protected private
données base
public public protected private
protected protected protected private
private interdit interdit interdit
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Désolé :

bien sûr que c'est possible :
(ou alors j'ai pas compris ce que tu voulais)

class Base {public: int a; protected : int b};
class D1 : protected A{};
class D2 : private A{};
et 'a' sera d'accès protected dans les classes D1, private dans D2.
'b' sera d'accès protected dans les classes D1, private dans D2.

voici l'ensemble des choses que tu peux faire :

héritage: public protected private
données base
public public protected private
protected protected protected private
private interdit interdit interdit
Messages postés
3809
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
22 avril 2020
105
@juju12: Effectivement, je n'y avais pas pensé.
@Merix: Merci pour cette solution, je viens d'apprendre une petite astuce très intéressante.