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] cast avec le type de base


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [héritage] cast avec le type de base
    Bonjour,

    d'abords excuser de mon incopétance total en C++, étant plus un spécialiste du Java ...

    Voici une partie de mon code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    class A {
     
      public :
        A();
        ~A();
        virtual void uneFonction() =0;
     
    }
     
    class B : private A {
     
      public : 
        B();
        ~B();
        void uneFonction() {...};
     
    }
     
    class C :
     
      public :
        C();
        ~C();
        uneAutreFonction(A a) {...}
    donc voila un exemple du code que je souhaite ... désoler je suis pas encore très a laise avec les * et les & ... donc je souhaite passé à la méthode uneAutreFonction(A a), un objet de type B.

    Si quelqu'un a une idée merci d'avance.

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Ca m'a l'air pas mal.

    Par contre, il est vrai qu'il faut utiliser les * ou les &.

    Tu peux écrire soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneAutreFonction(A* a) {...}
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneAutreFonction(A& a) {...}
    Je t'explique un peu pourquoi.

    Si tu utilises ta notation, l'objet qui sera passé à cette méthode sera dupliqué en mémoire, et c'est le nouvel objet qui sera manipulé dans ta méthode. Si dans ta méthode, tu modifies l'objet, la modif ne sera pas fait sur ton objet de base, mais sur l'objet dupliqué.

    Si tu utilises une des deux notations que je t'ai donné, l'objet utilisé dans ta méthode sera l'objet que tu lui passes. Pas de duplication mémoire. L'objet pourra être modifié, et les modifs seront conservé.

    C'est une grosse différence avec JAVA.

    Si dans ta méthode, tu ne veux pas pour modifier ton objet, tu peux utiliser la notation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneAutreFonction(const A& a) {...}
    Pour ce qui est du passage de valeur, tu peux lui passer un objet B puisqu'il hérite de l'objet A. Le cast se fait automatiquement.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour tes info,

    mais j'ai toujours un soucie, j'ai fais un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    int main() {
      B * b = new B();
      C c;
      c.uneAutreFonction(b);
    }
    et à la compilation ça me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    `A' is an inaccessible base of `B'

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Désolé, j'avais pas vu le problème.

    En fait, la classe B hérite de A mais en private, donc tu peux pas utiliser la classe B dans ta méthode uneAutreFonction.

    Pour corriger le problème, il faut que tu fasses un héritage public. Et la, ca devrait marcher.

    Essaie pour voir.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Effectivement.

    Petit topo :
    L'héritage privé est un héritage de réutilisation, il sert principalement à reprendre du code de la classe de base. Il est (presque) équivalent à une aggrégation.
    L'héritage publique est un héritage d'interface, il sert lorsque tu veux utiliser tes instances de la classe dérivée "comme des" instances de la classe de base. Ce qui est exactement ce que tu veux faire ici.

    (pas taper si je n'utilise pas exactement les bons termes !)

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour cè info ...
    et surment à très bientot ...

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Les principes sont là.
    On pourrait pinailler en disant que l'héritage public laisse entendre un sous-typage (IIRC ce que définit Mme (/zelle ?) Liskov, un objet b dont le type est un sous-type de A est substituable /utilisable en place d'objets de type A ; chose que rejoint l'héritage d'interface) et que si ce n'est pas le cas, on ouvre la porte aux problèmes. Car syntaxiquement (avec l'héritage public) on peut utiliser b comme un A, même si B n'est pas un vrai sous-type de A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2015, 21h49
  2. Réponses: 25
    Dernier message: 11/08/2010, 15h54
  3. cast avec un type variable
    Par Axwell dans le forum C++
    Réponses: 2
    Dernier message: 13/11/2007, 10h06
  4. utilisation de "LIKE" avec un type datetime dans r
    Par ericmart dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2003, 14h58
  5. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48

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