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

MFC Discussion :

surcharge de fonction virtuelle et VC++6


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Par défaut surcharge de fonction virtuelle et VC++6
    Bonjour,

    j'ai un code source développé sous linux, qui compile donc avec gcc (et VS express 2005 accesoirement) mais pas avec visual studio 6 (que je dois pourtant utiliser pour fusionner avec un autre code). Le problème étant:

    c:\savsimth\smaexpr.h(56) : error C2555: 'ValExpr<T>::optim' : overriding virtual function differs from 'SMAExpr::optim' only by return type or calling convention
    c:\savsimth\smaexpr.h(28) : see declaration of 'SMAExpr'
    c:\savsimth\smaexpr.h(58) : see reference to class template instantiation 'ValExpr<T>' being compiled
    c:\savsimth\smaexpr.h(56) : error C2555: 'ValExpr<bool>::optim' : overriding virtual function differs from 'SMAExpr::optim' only by return type or calling convention
    c:\savsimth\smaexpr.h(28) : see declaration of 'SMAExpr'
    c:\savsimth\smaexpr.h(89) : see reference to class template instantiation 'ValExpr<bool>' being compiled
    c:\savsimth\smaexpr.h(100) : error C2555: 'CompExpr::optim' : overriding virtual function differs from 'SMAExpr::optim' only by return type or calling convention
    c:\savsimth\smaexpr.h(28) : see declaration of 'SMAExpr'
    c:\savsimth\smaexpr.h(56) : error C2555: 'ValExpr<float>::optim' : overriding virtual function differs from 'SMAExpr::optim' only by return type or calling convention
    c:\savsimth\smaexpr.h(28) : see declaration of 'SMAExpr'
    c:\savsimth\smaexpr.h(112) : see reference to class template instantiation 'ValExpr<float>' being compiled
    c:\savsimth\agent.cpp(117) : error C2371: 'si' : redefinition; different basic types
    c:\savsimth\agent.cpp(113) : see declaration of 'si'
    les codes étant :
    virtual SMAExpr* optim() {return this;}

    virtual ValExpr<T>* optim() {return this;}
    et des scpécialisations dans les sous classes ensuite

    Que faire?

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    VC6 est connu pour ne pas respecter le standard, donc bon
    Maintenant, tu peux donner le prototype des 2 fonctions, l'original et celle dans la dérivée ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Par défaut
    virtual SMAExpr * optim ()
    ValExpr< T > * optim ()
    virtual ValExpr< T > * optim ()
    ValExpr< bool > * optim ()

    En fait ce qui ne lui plait peut être pas c'est d'avoir le même prototype de fonction dans 2 sous classes différentes? Ou juste que celle qui retourne un SMAExpr* ai le même code que celle qui retourne un ValExpr* ?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attends, je t'ai demandé 2 prototypes, tu m'en donnes 4, qui va où ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Par défaut
    Citation Envoyé par Miles
    Attends, je t'ai demandé 2 prototypes, tu m'en donnes 4, qui va où ?
    Classe mère: SMAExpr avec SMAExpr * optim ()
    ValExpr(héritant de SMAExpr) avec virtual ValExpr< T > * optim ()
    Opexpr (héritant de ValExpr<T>) virtual ValExpr<T>* optim();
    CompExpr (héritant de ValExpr<bool>) ValExpr<bool>* optim();

    @JeanMarc: il suffirait "juste" d'enlever le virtual partout donc?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si tu enlèves le virtual, tu n'as plus la possibilité d'appeler la fonction de la classe dérivée à la place de celle de la classe mère, c'est embêtant !

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par grodwar
    @JeanMarc: il suffirait "juste" d'enlever le virtual partout donc?
    Est-ce que c'est ce que j'ai fait dans l'exemple que j'ai donne?

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Petite note de nomenclature:
    - surcharger (anglais overload), c'est avoir plusieurs fonctions avec des signatures differentes mais le meme nom;
    - remplacer une fonction virtuelle dans une classe derivee (anglais override), ce dit redefinir ou supplanter.

    Citation Envoyé par grodwar
    c:\savsimth\smaexpr.h(56) : error C2555: 'ValExpr<T>::optim' : overriding virtual function differs from 'SMAExpr::optim' only by return type or calling convention

    les codes étant :
    virtual SMAExpr* optim() {return this;}

    virtual ValExpr<T>* optim() {return this;}
    et des scpécialisations dans les sous classes ensuite
    Tu utilises des retours covariants, la possibilite de supplanter une fonction membre retournant un pointeur ou une reference vers sa classe par une autre retournant un pointeur ou une reference vers la classe derivee. Ca ne m'etonnerait pas du tout que VC6 n'implemente pas cela. La technique habituelle est d'eviter de faire un retour covariant et d'utiliser la possibilite de remplacer des fonctions membres non virtuelles (c'est un des rares cas legitimes pour le faire).

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Base {
    public:
       Base* f() { return do_f(); }
    private:
       virtual Base* do_f() { return this; }
    };
     
    class Derivee: public Base {
    public:
       Derivee* f() { return static_cast<Derivee*>(do_f()); }
    private:
       /* virtual */ Base* do_f() { return this; }
    };
    les points importants etant:
    - f() n'est pas virtuelle mais on change son type de retour;
    - do_f() est virtuelle et on ne change pas son type de retour.

    Edit: Correction du code, il faut toujours tester avec de poster

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

Discussions similaires

  1. Surcharge de fonction virtuelle pure
    Par lg_53 dans le forum C++
    Réponses: 4
    Dernier message: 07/11/2014, 15h26
  2. Surcharger une fonction virtuelle
    Par pierreJTL dans le forum Débuter
    Réponses: 3
    Dernier message: 18/06/2012, 14h44
  3. Réponses: 16
    Dernier message: 21/05/2007, 01h04
  4. Réponses: 10
    Dernier message: 22/03/2006, 10h49
  5. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56

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