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 :

principe C++ héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut principe C++ héritage
    Bonjour à tous,

    j'ai une petite question concernant le C++ sur l'héritage. Je sais pas si c possible mais j'aimerai déclarer une structure dans une classe mère, redéfinir cette structure dans la classe fille qui serait la même structure + quelques params typiques à la fille et j'aimerai pouvoir initialiser par une fonction de la classe mère les variables relatifs à la mère et initialiser dans la fille juste les params en plus.

    Pour être plus clair, j'aimerai pouvoir faire ça (mais ça marche pas) :

    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
     
    struct TOTO{
    int T1;
    int T2;
    }
     
    Class A
    {
     A();
     ~A();
     
     void Init(){st.T1 = 1; st.T2 = 2;}
     
     struct TOTO st;
    }
    et

    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
    struct TOTO{
    int T1;
    int T2;
    int T3;
    }
     
    Class B : public A
    {
     B();
     ~B();
     
     void Init() {A::Init(); st.T3 = 3;}
     
     struct TOTO st;
    }
    et qd je passe en pas à pas, dans la fonction B::Init(), on va bien dans la fonction A::Init(), on initialise T1 et T2 mais quand on revient dans la classe B, T1 et T2 ont des valeurs bidons.

    Est-ce qu'il est possible de faire ça? il manque un mot clef quelque part?

    merci

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par loup_precaire Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct TOTO{
    int T1;
    int T2;
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct TOTO{
    int T1;
    int T2;
    int T3;
    }

    là, il y a déjà des problème: d'une part tu ne peut définbir toto qu'une fois (décide toi), et d'autre part, il faut mettre un "; " à la fin des struct.

    donc tu ne peux pas faire comme ça

    pourquoi ne pas mettre T1, T2 et T3 directement à l'interieur des classes ?:
    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
    Class A
    {
      int T1;
       int T2;
       A();
     ~A();
     
     void Init(){T1 = 1; T2 = 2;}
     
     
     
    }
    Class B : public A
    {
      int T3;
     B();
     ~B();
     
     void Init() {A::Init();T3 = 3;}
     
     
    }
    c'est plus simple.

    Par contre, méfie toi, init est en private dans tes déclarations.


    bonne chance

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    en fait là j'ai bcp simplifié le pb, dans mon code j'ai bien mis les ; où il faut, je n'ai d'ailleurs aucun pb de compilation.

    Et si j'ai voulu passer par des struct c parce que j'ai une classe avec bcp de données et que pour m'y retrouver, j'ai voulu structuré ça en regroupant certaines données sous forme de structure.

    J'ai essayé avec une seule structure et j'ai qd meme un pb bizarre :

    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
     
    struct TOTO{
    int T1;
    int T2;
    int T3;
    }
     
    Class A
    {
     A();
     ~A();
     
     void Init(){st.T1 = 1; st.T2 = 2;}
     
     struct TOTO st;
    }
     
    Class B : public A
    {
     B();
     ~B();
     
     void Init() {A::Init(); st.T3 = 3;}
     
     struct TOTO st;
    }
    avec ça, qd je passe en pas à pas dans B::Init(), je vais dans A::Init() pr initialiser T1 et T2 mais de retour dans B::Init(), les valeurs de T1 et T2 ne sont pas initialisés. Une idée de pk?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Tu as déjà une variable membre st dans ta classe A. Donc, puisque B hérite de A, toute instance de B possède également cette variable, il ne faut pas la redéclarer, sinon ça pose des problèmes avec la portée.

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    effectivement oui merci et sinon, est-il possible de faire ce que je voulais faire au début à savoir :

    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
    27
    28
    29
    30
    31
    32
    33
     
     
     
    Class A
    {
      struct TOTO{
       int T1;
       int T2;
      }
     
     A();
     ~A();
     
     void Init(){st.T1 = 1; st.T2 = 2;}
     
     struct TOTO st;
    }
     
    Class B : public A
    {
      struct TOTO{
       int T1;
       int T2;
       int T3;
      }
     
    B();
     ~B();
     
     void Init() {A::Init(); st.T3 = 3;}
     
     struct TOTO st;
    }
    (ça compile) ou est-ce que dans ce cas la variable st de B est forcément différente de celle de A et donc l'initialisation par A ne passe pas?

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    ça compile effectivement, mais ça ne faira pas ce que tu veux.

    déjà, en déclarant tes variables comme ça, c'est équivalent à écrire
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    struct TOTO1{
       int T1;
       int T2;
      };
     
      struct TOTO2{
       int T1;
       int T2;
       int T3;
      };
     
     Class A
    {
     
     
     A();
     ~A();
     
     void Init(){st.T1 = 1; st.T2 = 2;}
     
     struct TOTO1 st;
    }
     
    Class B : public A
    {
     
    B();
     ~B();
     
     void Init() {A::Init(); st.T3 = 3;}
     
     struct TOTO2 st;
    }
    du coup, le st dont tu parle dans A et celui dans B ne sont pas les même. accessoirement, ton compilateur devrait au moins t'afficher un warning vis à vis du fait d'avoir une variable st qui surcharge l'autre.

    au final, ta classe B contient deux st différent, mais ils ne sont pas accessible de la même maniere: pour acceder au premier, je pense qu'il faut faire un truc du genre A::st dans B.

    donc ce que tu fait n'est pas viable et peut avoir des comportements imprévisibles.

    si tu veux vraiment avoir une modification de toto, fait comme cela:
    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
    27
    28
    29
    30
    Class A
    {
      struct TOTO{
       int T1;
       int T2;
     
       void Init(){T1 = 1; T2 = 2;}
      };
     
     A();
     ~A();
     
     void Init(){st.Init()}
     
     struct TOTO st;
    }
     
    Class B 
    {
      struct TOTO2: public A::TOTO{
       int T3;
      };
     
    B();
     ~B();
     
     void Init() {st.Init(); st.T3 = 3;}
     
     struct TOTO2 st;
    };
    Et franchement, met les ; à la fin des struct et des classes par-ce qu'il est probable que ton compilo les crées (donc utilise de la mémoire inutile), ou alors ton compilo est vachement tolérant.

Discussions similaires

  1. Principes d'héritages sur plusieurs assembly
    Par geektoo dans le forum VB.NET
    Réponses: 3
    Dernier message: 26/10/2014, 14h14
  2. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  3. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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