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 :

polymorphisme, pointeurs et classes abstraites


Sujet :

C++

  1. #1
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut polymorphisme, pointeurs et classes abstraites
    Salut !

    J' essaye d' utiliser le polymorphisme: j' ai 1 classe abstraite "ATTRIBUT", qui herite de 2 autres classes, "COLOR" et "VERTEX". J' essaye d' utiliser tous cela à l' aide de pointeur, mais sans resultat:

    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
     
    class VERTEX
    {
    public:
         void function(void);
    };
     
    class COLOR
    {
    public:
         void function(void);
    };
     
    class ATTRIBUT: public VERTEX, public COLOR
    {
    public:
         virtual void function(void) = 0;
    };
     
    int main()
    {
         ATTRIBUT *att;
     
         att = new VERTEX;
         delete att;
     
          att = new COLOR;
          delete att;
     
          return (0);
    }
    Et le compilateur me dit que la conversion de VERTEX* à ATTRIBUT* est invalide...


    Merci d' avance.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    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é : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    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
    36
    37
    #include <iostream>
     
    using std::cout;
    using std::endl;
     
    class VERTEX
    {
    public:
        virtual void function(void) { cout << "VERTEX" << endl; }
    };
     
    class COLOR
    {
    public:
        virtual void function(void) { cout << "COLOR" << endl; }
    };
     
    class ATTRIBUT: public VERTEX, public COLOR
    {
    public:
        virtual void function(void) = 0;
    }; 
     
    int main()
    {
        ATTRIBUT* att;
     
        att = reinterpret_cast<ATTRIBUT*>(new VERTEX);
        att->function();
        delete att;
     
        att = reinterpret_cast<ATTRIBUT*>(new COLOR);
        att->function();
        delete att;
     
        return (0);
    }

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu hérites dans le mauvais sens. Et reinterpret_cast est tout sauf la bonne solution en situation d'héritage. Ce truc, c'est essentiellement pour sérialiser des données typées dans des séquences d'octets, ou bidouiller avec des callback d'anciennes API.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    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 : 39
    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
    Pour compléter un peu la réponse de Luc, effectivement tu t'y prends dans le mauvais sens. Peut-être voulais-tu faire ç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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class ATTRIBUT
    {
    public:
        virtual ~ATTRIBUT(); // <-- NE PAS L'OUBLIER !!
     
         virtual void function(void) = 0;
    };
     
    class VERTEX : public ATTRIBUT
    {
    public:
         void function(void);
    };
     
    class COLOR : public ATTRIBUT
    {
    public:
         void function(void);
    };
     
     
    int main()
    {
         ATTRIBUT *att;
     
         att = new VERTEX;
         delete att;
     
          att = new COLOR;
          delete att;
     
          return (0);
    }

  5. #5
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Houlalalala. Apparemment, j' ai rien compris Dans code proposé par Loulou24, c' est donc ATTRIBUT qui herite de VERTEX et COLOR et pas le contraire ? Donc c'est ca l' heritage multiple ? Si oui, qu' est-ce que cette syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class maClasse : public maClasse1, public maClasse2
    {
    };
    Si je comprends bien, ici maClasse1 et maClasse2 herite de maClasse , c-à-d que maClasse1 et maClasse2 "auront" les variables de maClasse, ou l' inverse: maClasse "aura" les variables de maClasse1 et maClasse2 ? Apperemment j' ai tout melanger

    Et en effet j' avais oublié de preciser le destructeur virtual (warning avec l' option -Wall)

    Merci d' avance

  6. #6
    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 : 39
    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
    Si je comprends bien, ici maClasse1 et maClasse2 herite de maClasse , c-à-d que maClasse1 et maClasse2 "auront" les variables de maClasse, ou l' inverse: maClasse "aura" les variables de maClasse1 et maClasse2 ? Apperemment j' ai tout melanger
    Justement c'est ce qu'on te dit : tu t'y prends à l'envers. Dans ton exemple, c'est maClasse qui hérite de maClasse1 et maClasse2.

    Dans code proposé par Loulou24, c' est donc ATTRIBUT qui herite de VERTEX et COLOR et pas le contraire ?
    Pareil, c'est VERTEX et COLOR qui héritent de ATTRIBUT.

  7. #7
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Ok, je pense avoir compris: en fait moi je faisais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Class_Mere : public Class_Fille, public class Fille2
    {
          //mauvais
    };
     
    class Class_Fille : public Class_Mere, public class_Mere2
    {
          \\bon
    };
    :

  8. #8
    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 : 39
    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
    Yep, c'est ça.

    Peut-être que la lecture d'un chapitre sur l'héritage t'aiderait à y voir plus clair si tu n'es pas à l'aise avec ça, pense à faire un tour du côté de la page cours.

  9. #9
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Ok. En effet, je vais aller revoir tout ca

    Mais juste 3 questions par simple curiosité:
    1) Pourquoi doit on declarer le destucteur de la classe mère virtuelle ?
    2)Si je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class X
    {
         virtual ~X() = 0;
    };
    j' avais des erreurs de linkage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /tmp/cczJBGMg.o(.gnu.linkonce.t._ZN5COLORD1Ev+0x2d): In function `COLOR::~COLOR[in-charge]()':
    : undefined reference to `ATTRIBUTE::~ATTRIBUTE [not-in-charge]()'
    Il fallait en fait rajouter un corps à ~X (virtual ~X() { }). Donc: Pourquoi ?

    3)Y a-t-il un autre avantage (ou desaventage) à declarer les fonction des classes filles "virtual" a part les réutiliser pour du polymorphisme ?


    Merci d'avance.

  10. #10
    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 : 39
    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
    1) http://c.developpez.com/faq/cpp/?pag...UCTEUR_virtuel

    2) Oui, il faut toujours donner un corps au destructeur, même s'il est virtuel pur. Pourquoi ? Parce que ton compilo va l'appeler à la destruction de l'objet.

    3) Absolument aucun, ça sert juste au polymorphisme. Par contre je suppose que tu parlais de classe mère et non de classe fille (sachant qu'à partir du moment où une fonction est déclarée virtuelle, elle l'est implicitement dans toutes les classes dérivées).

  11. #11
    Nouveau membre du Club Avatar de legend666
    Étudiant
    Inscrit en
    Mars 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2004
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Ok, merci pour ces explications final !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/06/2011, 22h14
  2. Polymorphisme et interface#classes abstraites
    Par zalalus dans le forum Débuter
    Réponses: 6
    Dernier message: 23/02/2010, 14h58
  3. Réponses: 2
    Dernier message: 30/12/2009, 20h44
  4. Polymorphisme, classe abstraite
    Par MABB dans le forum C++
    Réponses: 2
    Dernier message: 30/06/2009, 22h23
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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