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

Messages postés
15
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2009
- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 23 juin 2009 à 09:40
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.
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
15
Date d'inscription
lundi 11 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2009
3
Merci
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;
};

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 204 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MeRiX
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
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.
Commenter la réponse de cptpingu
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
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
Commenter la réponse de cs_juju12
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
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
Commenter la réponse de cs_juju12
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
@juju12: Effectivement, je n'y avais pas pensé.
@Merix: Merci pour cette solution, je viens d'apprendre une petite astuce très intéressante.
Commenter la réponse de cptpingu