IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Héritage et accès aux données


Sujet :

C++

  1. #21
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Les règles pour l'accès protected sont un peu complexes. Le standard dit la chose suivante (11.5-1) :
    L'accès doit se faire par un pointeur, une référence ou un objet de la classe dérivée elle même.
    En clair, si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class B {
    protected :
        int i;
    };
    
    class D1 : public B
    {
    };
    
    class D2 : public B
    {
        void f(D1* pd1)
        {
            i=1; // ok
            pd1->i = 2; // interdit, il s'agit d'une autre classe dérivée
        }
    };

  2. #22
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par roulious
    Les règles pour l'accès protected sont un peu complexes. Le standard dit la chose suivante (11.5-1) :


    En clair, si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class B {
    protected :
        int i;
    };
    
    class D1 : public B
    {
    };
    
    class D2 : public B
    {
        void f(D1* pd1)
        {
            i=1; // ok
            pd1->i = 2; // interdit, il s'agit d'une autre classe dérivée
        }
    };

    lapin compris...

  3. #23
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par rigobert
    lapin compris...
    Moi, si j'ai bien compris, et en reprenant l'exemple de roulious, "i=1", on peut parce que cela correspond à "this->i" et que "this" est un pointeur sur D2.

    Par contre "pd1->i" on ne peut pas parce que ce n'est pas un pointeur sur D2 mais sur D (et que l'on est dans la classe D2).

  4. #24
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par Eusebe
    Moi, si j'ai bien compris, et en reprenant l'exemple de roulious, "i=1", on peut parce que cela correspond à "this->i" et que "this" est un pointeur sur D2.

    Par contre "pd1->i" on ne peut pas parce que ce n'est pas un pointeur sur D2 mais sur D (et que l'on est dans la classe D2).
    Je parlais de roulious.

    "pd1->i = 2" n'est pas possible parce que c'est une classe différente, point !!

    Rien à voir avec le problème mis en évidence par Medinoc...

  5. #25
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    La citation du standard était correcte, mais mon exemple est pourri, désolé. Le problème de Medinoc tombe sous le coup du standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CDerivee::Fonction(CDerivee *pObj)
    {
        CBase *pBase = pObj;
        pBase->m_protBase; // accès interdit
    }
    L'accès à m_protBase se fait par un pointeur sur CBase et non pas par un pointeur de la classe dérivée elle même, ici CDerivee. D'où l'accès interdit, et un accès autorisé en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CDerivee::Fonction(CDerivee *pObj)
    {
        pObj->m_protBase;
    }
    puisqu'on passe par un pointeur sur CDerivee.

    Même si pBase pointe sur un objet de type CDerivee, et qu'on peut y accéder sans problème par un static_cast ou un dynamic_cast, son type est nénamoins CBase*

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Héritage, Accès aux données ...
    Par Joad dans le forum C++
    Réponses: 14
    Dernier message: 28/04/2006, 11h16
  2. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33
  3. [débutant] avoir accès aux données de la base BCDI 3
    Par Valichou dans le forum Bases de données
    Réponses: 7
    Dernier message: 06/05/2004, 13h13
  4. accès aux donnée d'un DBGRID
    Par relax_06 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/03/2004, 23h06
  5. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo