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 :

Template et fonctions virtuelles


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Template et fonctions virtuelles
    Bonjour,

    Je voulais vous faire part d'un petit casse-tête auquel je me retrouve confronté et, plutôt que d'en faire des cauchemars, je sollicite vos compétences pour savoir s'il existe une solution simple. Voici le contexte :

    Soit une classe mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <typename T> class TOTO {
    public:
      virtual bool myFunc (const T&) {return false;} 
    };
    Soit une classe fille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <typename T> class TUTU : public T {
       // On s'en fout
    };
    Soit une classe fille de TUTU<TOTO<int>> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class TITI : public TUTU<TOTO<int>> {
    public:
      bool myFunc (const int&) {return true;}
    };
    Tout compile bien, sauf qu'à l'exécution, quand j'appelle TITI:myFunc, çà exécute TOTO:myFunc. Je ne peux passer myFunc en virtuelle pure dans TOTO car dans ce cas (logique!) erreur de compilation il y a vu que le compilo s'attend à voir définie cette méthode dans TUTU. Ce qui me laisse perplexe quand même (je pense que c'est à cause de la "templatisation"), c'est que la surcharge ne puisse pas "bypasser" un niveau d'héritage.
    Merci d'avance pour votre aide!! ;-)

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    Pas de problème chez moi et ça compile toujours avec override.

  3. #3
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 492
    Points : 6 202
    Points
    6 202
    Par défaut
    J'ai testé avec g++ 6.1.0 et ton code fonctionne :
    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
    // Version de g++ : 6.1.0
    // Commande : g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
     
    #include <iostream>
     
    template <typename T> class TOTO {
    public:
      virtual bool myFunc (const T&) {return false;} 
    };
     
    template <typename T> class TUTU : public T {
       // On s'en fout
    };
     
    class TITI : public TUTU<TOTO<int>> {
    public:
      bool myFunc (const int&) {return true;}
    };
     
    int main(int argc, char **argv)
    {
        TITI titi;
        TOTO<int>& toto = titi;
        std::cout << "toto.myFunc(1) : " << (toto.myFunc(1) ? "true" : "false"); // affiche true
        return 0;
    }
    Ça marche aussi si on rend virtuelle pure la fonction TOTO<T>::myFunc.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonsoir à tous,

    Je confirme vous avez raison, mon code fonctionne parfaitement! Comme la vérité est toujours ailleurs.... C'est dans le // On s'en fout que le problème se trouvait...

    Pour compléter la classe TUTU, voici le dérapage non contrôlé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class T> class TUTU : public T {
    public:
      void addElement(TUTU<T>& p_elem) {
        m_list.push_back(p_elem);
      }
    private:
      std::vector<TUTU<T>> m_list;
    };
    Je pense que je n'ai pas besoin d'aller plus loin dans le détail... Et je vais de ce pas recopier 100 fois : "par copie, tu ne pêcheras plus!" ...
    Merci en tous cas de m'avoir permis de me débloquer!
    Je laisse un peu chercher mais si la solution intéresse je peux la publier bien sûr!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/11/2015, 19h30
  2. Classe Template et fonction virtuelle cachée
    Par benbarate dans le forum C++
    Réponses: 5
    Dernier message: 14/05/2010, 10h09
  3. Réponses: 2
    Dernier message: 02/10/2008, 17h37
  4. Une fonction virtuelle ne peut pas retourner un template!
    Par coyotte507 dans le forum Langage
    Réponses: 10
    Dernier message: 08/02/2008, 21h39
  5. Réponses: 8
    Dernier message: 18/06/2007, 16h06

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