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 :

Opérateur et héritage


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut Opérateur et héritage
    Bonjour,

    J'ai une classe dans laquelle je surcharge l'operateur = en interne et l'opérateur * en externe (car je ne veux pas modifier le premier membre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class base
    {
    public:
       base();
       base(const base &inst);
       base &operator=(const base &inst);
    }
    base operator* (base &inst1, base &inst2);
    Jusqu'ici tout fonctionne correctement et j'arrive bien à ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    base b1,b2,res
    ...
    res = b1 * b2
    Ensuite je fais une classe qui descend de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class fille : public base
    {
    public
       fille();
       fille(int a, int b);
       fille(const fille &inst);
    }
    Et là ca ne compile plus, quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fille f1,f2,res
    ...
    res = f1 * f2
    Le compilateur me dit : "Impossible de trouver une correspondance pour fille::operator=(base)"

    Faut-il redéfinir l'opérateur pour toutes les classes filles (et dans ce cas avec quelle syntaxe pour apperler celui de base) ?

    Une deuxième question est : est-il nécessaire de redéfinir le constructeur par défaut et le constructeur de copie dans la classe fille si ceux-ci ne font rien de plus que ceux de la classe base (a priori non) ?

    Merci pour votre aide.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Alfred12
    J'ai une classe dans laquelle je surcharge l'operateur = en interne et l'opérateur * en externe (car je ne veux pas modifier le premier membre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class base
    {
    public:
       base();
       base(const base &inst);
       base &operator=(const base &inst);
    }
    base operator* (base &inst1, base &inst2);
    On se demande pourquoi des base& et pas des basec const&.

    Et là ca ne compile plus, quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fille f1,f2,res
    ...
    res = f1 * f2
    Le compilateur me dit : "Impossible de trouver une correspondance pour fille::operator=(base)"

    Faut-il redéfinir l'opérateur pour toutes les classes filles (et dans ce cas avec quelle syntaxe pour apperler celui de base) ?
    Oui.

    fille* operator=(base const& other) {
    base::operator=(other);
    return this;
    }

    Une deuxième question est : est-il nécessaire de redéfinir le constructeur par défaut et le constructeur de copie dans la classe fille si ceux-ci ne font rien de plus que ceux de la classe base (a priori non) ?
    Gagne.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    On se demande pourquoi des base& et pas des basec const&
    Ce que je voulais dire c'est que la variable transmise par référence n'est pas modifiée
    D'ailleur cela m'ammène à d'autre questions
    - est ce que : func (const base &inst) est équivalent à func(base const &inst) ?
    - quel est l'intérêt d'écrire func(base &const inst) ? Je croyais que les références étaient constantes par nature, c'est à dire qu'il y avait équivalence entre : func (base *const inst) et func(base &inst)


    Pour revenir à mon problème initial, il semble que le problème viennent du fait que mon opérateur* externe renvoie une classe base.
    Il faut donc ajouter à la classe fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fille &operator=(const base &inst)
    pour pouvoir affecter une classe base à classe fille.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Alfred12
    Ce que je voulais dire c'est que la variable transmise par référence n'est pas modifiée
    Ce n'est pas ce que tu dis.

    D'ailleur cela m'ammène à d'autre questions
    - est ce que : func (const base &inst) est équivalent à func(base const &inst) ?
    Oui.
    - quel est l'intérêt d'écrire func(base &const inst) ?
    Ca compile ?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    Ce n'est pas ce que tu dis.
    Qu'est ce que je dis alors ?

    En fait mes deux opérateurs sont comme ça (il y avait une petite erreur dans le premier message) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    base &operator=(const base &inst);
    ...
    base operator* (const base &inst1, const base &inst2);
    Ce qui pour moi signifie que les variables inst, inst1 et inst2 ne seront pas modifiées par les opérateurs.


    Ca compile ?
    Ca n'a pas l'air de poser de problème à C++ Builder.

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Alfred12
    En fait mes deux opérateurs sont comme ça (il y avait une petite erreur dans le premier message) :
    Dire que c'est une erreur, c'est repondre a ma question.

    Ca n'a pas l'air de poser de problème à C++ Builder.
    Citation Envoyé par Comeau Online
    "ComeauTest.c", line 1: error: type qualifier on a reference type is not allowed
    void func(int &const i) {
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    "ComeauTest.c", line 1: error: type qualifier on a reference type is not allowed
    void func(int &const i) {
    Ca c'est cohérent avec ce que j'ai compris.

    Pour C++ Builder, pas même un avertissement dans la déclaration (au niveau max d'avertissement).

    Une erreur si toutefois on essaye de changer la référence (&i = ptr), avec un message incompréhensible :

    [C++ Erreur] test.cpp(4): E2277 Lvalue nécessaire
    En tous cas merci pour ton aide.

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

Discussions similaires

  1. Héritage privé et opérateur de conversion
    Par Lavock dans le forum Langage
    Réponses: 7
    Dernier message: 21/06/2010, 19h25
  2. Héritage et opérateurs "externes"
    Par TNT89 dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2009, 08h04
  3. Surcharge d'opérateurs et héritage.
    Par Opérateur dans le forum C++
    Réponses: 9
    Dernier message: 21/12/2008, 18h11
  4. [POO] Opérateurs & Héritage
    Par Haknaton dans le forum C++
    Réponses: 3
    Dernier message: 05/10/2008, 22h47
  5. Opérateur, héritage et liaison dynamique
    Par juzam dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2007, 00h47

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