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 :

petite question sur l'heritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut petite question sur l'heritage
    bonsoir,

    juste une petite question ,voila je cree une class qui herite d'une autre class



    on peut peut creer une instance de la class t avec une class f ?

    exemple t= new f;

    ma question c'est pour quel raison que l'on instancie une class avec une autre et pourquoi

    merci d'avance !

  2. #2
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    Bon je vais essayer de faire simple:

    1. premier exemple
    Soit A une classe qui définie les propriété des astres de l'univers (système solaire),

    Soit B une classe qui hérite de A et qui définie les étoiles,
    et C une classe qui dérive de A également et qui définie les planète.

    Faire: A b = new B(); et A c = new C();

    permet de stocker B et C dans une liste (pointeur ou link, map,...) de type A.

    2. un autre exemple

    Soit A une classe qui définie des Entier et qui possède une méthode d'addition(virtuelle).
    soit B une classe qui définie des float et qui possède la définition de la méthode virtuelle signée dans A (décrite).
    soit C une classe qui définie des double et qui possède la définition de la méthode virtuelle signée dans A (décrite).

    Faire: A b = new B(); et A c = new C(); et int J;

    permet de faire b.add(int J); et c.add(int J);

    les deux classes possède la même méthode mais le compilateur ira chercher celle de B ou de C suivant leur classe (polymorphisme).

    j'espère que j'ai été assez explicite

    ps: ca permet de faire bien plus que ces deux exemple.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Asmod_D Voir le message
    on peut peut creer une instance de la class t avec une class f ?

    exemple t= new f;
    Pas avec cette écriture, en tout cas.
    Mais on peut fait ceci:
    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
    class Base
    {
    public:
    	int a;
    };
     
    class Deriv : public Base
    {
    public:
    	int b;
    };
     
    void UneFonction(void)
    {
    	Base * pb1 = new Base;
    	pb1->a = 1;
     
    	Base * pb2 = new Deriv;
    	pb2->a = 2;
     
    	Deriv * pd = new Deriv;
    	pd->a = 3;
    	pd->b = 42;
     
    	delete pd;
    	delete pb2; //Note: Problème ici si Deriv est complexe et le destructeur de Base n'est pas virtuel
    	delete pb1;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut
    merci beaucoup pour vos reponses

    si j'ai bien compris : lorsque l'on cree une instance exemple :

    A * b=new B(); b peut prendre les methode de la classe A en plus de la classe B

    merci !

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais on ne peut pas accéder directement aux méthodes de la classe B à travers un A* (sauf pour les méthodes virtuelles de A redéfinies par B)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    AkH
    AkH est déconnecté
    Membre confirmé
    Homme Profil pro
    Perso
    Inscrit en
    Juillet 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Perso

    Informations forums :
    Inscription : Juillet 2005
    Messages : 58
    Par défaut
    Si tu déclare B* b = new B();

    la tu accède aux méthodes de A et de B

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    +1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Asmod_D Voir le message
    merci beaucoup pour vos reponses

    si j'ai bien compris : lorsque l'on cree une instance exemple :

    A * b=new B(); b peut prendre les methode de la classe A en plus de la classe B

    merci !
    Non. On accède à un objet de type B via l'interface de A. Si A définit des méthodes virtuelles qui sont surchargées par B, alors le comportement de B sera utilisé.
    Un exemple simple :
    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
     
    #include <iostream>
    class A
    {
    public:
      A() { std::cout << "constructeur de A" << std::endl; }
      virtual ~A() { std::cout << "destructeur virtuel de A" << std::endl; }
      void f1() { std::cout << "appel de A::f1()" << std::endl; }
      virtual void f2() { std::cout << "appel de A::f2()" << std::endl; }
    };
    class B : public A
    {
    public:
      B() { std::cout << "constructeur de B" << std::endl; }
      virtual ~B() { std::cout << "destructeur virtuel de B" << std::endl ;}
      void f1() { std::cout << "appel de B::f1()" << std::endl; }
      virtual void f2() { std::cout << "appel de B::f2()" << std::endl; }
    };
    int main()
    {
      A* a = new B();
      a->f1();
      a->f2();
      delete a;
    }
    // provoque l'affichage suivant: 
    // -----------------------------
    // constructeur de A
    // constructeur de B
    // appel de A::f1()
    // appel de B::f2()
    // destructeur virtuel de B
    // destructeur virtuel de A
    // -----------------------------
    Note que certains appels sont implicites. Si tu veux appeler A::f2() dans la fonction B::f2(), l'appel doit être explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class B : public A
    {
    public:
      // ... idem précédent
      virtual void f2() 
      { 
        A::f2(); // <-- APPEL EXPLICITE
        std::cout << "appel de B::f2()" << std::endl; 
      }
    };
    De même, si le constructeur de A n'est pas un constructeur par défaut, il faut l'appeler explicitement dans la liste des initialiseurs de B :
    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
     
    #include <iostream>
    class A
    {
    public:
      A(int i) { std::cout << "constructeur de A avec i=" << i << std::endl; }
      virtual ~A() { std::cout << "destructeur virtuel de A" << std::endl; }
      void f1() { std::cout << "appel de A::f1()" << std::endl; }
      virtual void f2() { std::cout << "appel de A::f2()" << std::endl; }
    };
    class B : public A
    {
    public:
      B() : A(10) // <-- APPEL DU CTOR DE A DANS LA LISTE DES INITIALISEURS
      { std::cout << "constructeur de B" << std::endl; }
      virtual ~B() { std::cout << "destructeur virtuel de B" << std::endl ;}
      void f1() { std::cout << "appel de B::f1()" << std::endl; }
      virtual void f2() { std::cout << "appel de B::f2()" << std::endl; }
    };
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut
    merci a tous pour vos reponse .

    donc si j'ai bien compris

    A a =new B();

    lorsque la classe A cree des methode virtuelle de meme nom que la classe B qui la derive

    a prend la methode de la classe B

    et lorsque que les methode de A ne sont pas virtuelle mais quelles ont le meme nom elle prends la methode de la classe A

    et si par exemple les methode de A sont differente de la classe B elle prends les methode de la classe A et pour la class B c'est pareil

    une petite question est ce que l'on est oubligé de cree aussi des methodes virtuelles pour la class B pour la meme methode que la classe A

    car normalement on doit juste cree la methode virtuelle a la classe mere pour que la classe qui l'a derive puisse utilisé ses propres methodes du meme nom? "comme pour java"


    merci ! et merci encore

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    A *a = new B();
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Reprenons peut etre tout depuis le début, car il me semble que cela ne te fera pas de mal

    D'abord, le mot clé new demande l'allocation de mémoire pour un pointeur, et tu dois donc veiller à ce qui se trouve à gauche du " = " qui précède new soit un pointeur

    Ensuite, l'héritage est la liaison la plus forte que tu puisse trouver: on parle régulièrement de liaison "est un"

    Cela signifie qu'une classe B peut hériter d'une classe A si tu considère que l'on peut remplacer une instance de la classe B par une instance de la classe A et que le seul résultat est de perdre une spécialisation ou une généralisation, mais que, si tu retire "la partie de A" qui se trouve dans B, tu obtiens quel que chose qui n'est absolument plus un B.

    Ainsi, l'homme est un mammifère.

    A ce titre, l'homme a toutes les caractéristiques des autres mammifères, et, si tu retire cette notion de mammifère de l'homme, tu obtiens une sorte de chose diffuse et informe, qui ne peut absolument plus ni survivre, ni se reproduire.

    En effet, ce qui caractérise un mammifère, c'est sa capacité à se reproduire - et, surtout, la manière dont cette capacité est mise en oeuvre (le fait de "garder son rejeton en soi pendant une durée plus ou moins longue") - et une série d'autres caractéristiques - telle que celle d'être "vertébré" - ou comportements qui peuvent prendre des termes génériques communs.

    Mais, en dehors de l'homme, il existe une tripotée d'autres mammifères: Cela va de la baleine au lion en passant par le chat, le chien, la souris, l'éléphant, la girafe, le zèbre et bien d'autres encore.

    Si tu veux faire tenir tout ce beau monde dans un même conteneur, tu devra te contenter de ce qui leur est commun: le fait d'être des mammifères.

    Et tu devra accepter, en échange, de perdre certaines informations comme le fait que la baleine vit sous l'eau, ou comme le fait que l'homme se considère intelligent par rapport à tous les autres

    Par contre, des termes génériques tels que "manger", "digérer"," dormir","se reproduire" vont à chaque fois prendre une signification particulière pour chaque type dérivé de mammifère: ce sera l'équivalent à des méthodes virtuelles déclarée directement au sein de la classe mammifère, et redéfinies au sein des classes dérivées de telle manière à prendre en compte que la gestation d'une souris est de quelque jours là où elle s'élève à 9 mois chez l'homme ou à 2 ans chez l'éléphant.

    Ce phénomène s'appelle le polymorphisme: toutes les classes qui dérivent d'une classe "mere" sont en mesure d'émettre ou de réagir à certains messages type, mais, la manière que chacune de ces classes aura de réagir face à ces messages reçu ou de se comporter avant d'envoyer un message dépendra du type réel de la classe dérivée.

    Ainsi, quand tu écris un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mammifere *h=new Homme();
    c'est comme si tu disais au compilateur:
    Je sais que h est un homme.
    h sait aussi qu'il est un homme.
    Mais toi (com...pilateur), je te demande de le gérer comme si c'était un mammifère
    De cette manière, tu pourras faire cohabiter dans un conteneur de mammifère ton chat, ton chien, ta souris, ton éléphant et tous les autres... y compris toi et ton voisin qui ne supporte pas ton chien
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut
    merci a vous tous pour vos reponses qui m'ont beaucoup aidé et a mieux comprendre le principe de déclarer une instance par raport a une classe differente.


    merci !

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  2. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  3. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  4. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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