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 récursif avec héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Par défaut Polymorphisme récursif avec héritage
    Bonjour à tous,

    Tout d'abord, désolé pour le titre mais je ne savais pas trop quoi mettre...

    Je suis en train de me programmer une classe pour m'aider dans mes développements. Le but de cette classe est de fournir les opérateurs d'égalité et de comparaison (comme std::rel_ops).
    Mais voilà, j'ai un problème...

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    namespace
    {
        class Operator
        {
            public:
                virtual ~Operator() throw() {}
                virtual bool operator == (const Operator &op) const throw()
                {
                    cout << "Operator ==" << endl;
                    return !(*this != op);
                }
                virtual bool operator != (const Operator &op) const throw()
                {
                    cout << "Operator !=" << endl;
                    return !(*this == op);
                }
                virtual void fct1(const Operator &op) const throw()
                {
                    cout << fct2() << endl;
                    cout << op.fct2() << endl;
                }
                virtual string fct2() const throw()
                {
                    return "Operator fct2()";
                }
        };
     
        class Test : public Operator
        {
            int _nb;
            public:
                Test(int n) : _nb(n) {}
                virtual ~Test() throw() {}
                virtual bool operator == (const Test &op) const throw()
                {
                    cout << "Test ==" << endl;
                    return _nb == op._nb;
                }
                virtual string fct2() const throw()
                {
                    return "Test fct2()";
                }
        };
    }
     
    int main(int argc, char *argv[])
    {
        Test t1(3), t2(5);
        t1.fct1(t2);  // {1}
     
        if (t1 == t2) // {1}
            cout << "t1 == t2" << endl;
        else if (t1 != t2)  // {2}
            cout << "t1 != t2" << endl;
     
        return 0;
    }
    • {1} : ici la fonction va faire un appel à Operator::fct1() qui elle même fait appel à Test::fct2(). Tout fonctionne correctement.
    • {2} : j'appelle directement la fonction Test::operator==(), donc ok ça fonctionne.
    • {3} : ...et c'est ici que je plante : le premier appel utilise Operator::operator!=(), par contre celle-ci fait appel à Operator::operator==() à la place de Test::operator==().


    Est-ce que je me suis planté quelque part ? Vu que les fonctions fct1/fct2 marchent bien...

    Merci pour votre aide,

    Tipoun

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Citation Envoyé par Tipoun Voir le message
    Est-ce que je me suis planté quelque part ?
    En voulant mélanger héritage et sémantique de valeur...
    Tu peux persister dans cette voie, mais si tu arrives à quelque chose, cela sera d'une complexité des plus inutiles.

    Que veux-tu vraiment faire ? Pourquoi l'héritage?
    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...

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    En voulant mélanger héritage et sémantique de valeur...
    Tu peux persister dans cette voie, mais si tu arrives à quelque chose, cela sera d'une complexité des plus inutiles.

    Que veux-tu vraiment faire ? Pourquoi l'héritage?
    Arff....

    À la base je voulais utiliser les surcharges automatiques des opérateurs définies dans <utility>.
    Il suffit de définir les opérateurs == et < pour avoir !=, <=, > et >=.
    Cependant, cela m'oblige à déclarer "using std::rel_ops" dans chaque fichier de classe utilisant ces opérateurs.
    J'ai alors pensé à faire une classe pour faciliter la déclaration. Donc dans la classe fille, je n'ai plus qu'à créer les fonctions == et < (comme avec l'utilisation de std::rel_ops, mais sans les "using").

    C'est assez clair ?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    OK je vois. Il me semble avoir vu des trucs à ce sujet dans boost.

    D'ailleurs, est-ce que cette discussion pourrait t'aider : http://lists.boost.org/Archives/boos.../07/107856.php ?
    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...

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Par défaut
    Merci pour ce lien, c'est exactement ce que je cherchais ^^

  6. #6
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    pour en revenir à ton exemple de départ, je viens de comprendre pourquoi le cas {3} ne te donne pas le résultat que tu attendais. En fait la méthode bool operator == (const Operator &op) n'est jamais redéfinie dans Test ! La méthode bool operator == (const Test &op) n'ayant pas les mêmes paramètres, il s'agit d'une nouvelle méthode virtuelle indépendante de l'autre. Avec fct1 et fct2 cela reviendrait à
    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
    class Operator
    {
    public:
        virtual void fct1(const Operator &op) const throw()
        {
            cout << "Operator fct1()" << endl;
            fct2(op);
        }
     
        virtual void fct2(const Operator &op) const throw()
        {      
            cout << "Operator fct2()" << endl;
        }
    };
     
    class Test : public Operator
    {
        int _nb;
    public:
        Test(int n) : _nb(n) {}
        virtual ~Test() throw() {}
     
        virtual void fct2(const Test &op) const throw()
        {
            cout << "Test fct2()" << endl;
        }
    };
     
    int main(int argc, char *argv[])
    {
        Test t1(3), t2(5);
        t1.fct1(t2);  // {1}
        return 0;
    }
    Produit :
    Operator fct1()
    Operator fct2()

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

Discussions similaires

  1. Tri dichotomique récursif avec pivot
    Par miltone dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 21/03/2008, 12h01
  2. type générique avec héritage multiple
    Par apqmwnqmap dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 14h56
  3. Réponses: 3
    Dernier message: 06/11/2007, 09h29
  4. Erreur du designer avec héritage d'une classe abstraite
    Par Xzander dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2007, 00h36
  5. Réponses: 2
    Dernier message: 25/07/2004, 23h24

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