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

Langage C++ Discussion :

héritage template virtual destructeur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut héritage template virtual destructeur
    Bonjour,

    Dans le cas ou je crée une classe template de base avec un destructeur virtuel, et que j'hérite de cette classe de base, ai-je l'assurance que le destructeur de la classe dérivée soit toujours appelé si je manipule que des pointeur de base ?

    Exemple :

    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
     
    #include <iostream>
     
    using namespace std;
     
    template <typename T> class Base
    {
    public:
        Base(const T &_tparam = T()):tparam(_tparam){}
        virtual ~Base(){ cout << "Call ~Base()" << endl; }
     
        T tparam;
    };
     
    class Derived : public Base<int>
    {
    public:
        Derived(const int &_integer):Base<int>(_integer){}
        ~Derived(){ cout << "Call ~Derived()" << endl; }
    };
     
     
    int main (int /*argc*/, char * /*argv*/[])
    {
        Base<int> * ptr = new Derived(0);
        delete ptr;
        return 0;
    }
    Cet exemple fonctionne (gcc 4.4.5), mais je crains que dans un gros projet avec plusieurs classes dérivées cela ne fonctionne plus, car peut être que je risque d'exploser la VTABLE ? Sinon comment faire ?

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    Je me suis jamais posé la question, mais je pense que si tu arrives à faire "exploser la vtbl" (à part celle de la mémoire de la machine, a-t-elle une autre limite ?) c'est surment que ta hiérarchie d'héritage est beaucoup trop grosse, ie problème de conception très probable.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Je me suis jamais posé la question, mais je pense que si tu arrives à faire "exploser la vtbl" (à part celle de la mémoire de la machine, a-t-elle une autre limite ?)
    Dans les annexes, la norme recommande qu'une implémentation supporte au moins 16 384 'Final overriding virtual functions' ce qui revient à dire une vtable d'au moins 16384 entrées. Donc après, si ta classe a besoin de plus ...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour

    Citation Envoyé par ziker Voir le message
    Dans le cas ou je crée une classe template de base avec un destructeur virtuel, et que j'hérite de cette classe de base, ai-je l'assurance que le destructeur de la classe dérivée soit toujours appelé si je manipule que des pointeur de base ?
    Oui et cela fonctionnera tout le temps, tant que le destructeur de base est bien virtuel.
    C'est pour cela que tout destructeur de classe se faisant hérité, doit être virtuel, afin que le compilateur appelle le destructeur de la classe hérité.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut
    Bonjour,

    Ok merci pour vos réponses.
    Pour le destructeur cela fonctionnera toujours.

    Par contre pour une méthode virtuelle (pure ou non) dans la classe base, cela n'est pas recommandé ?

    J'avoue être un peu perdu, car j'entends sur plusieurs forums que virtual + template ne font pas bon ménage ensemble, pourtant quand je teste, cela semble toujours fonctionner. Et je ne vois pas trop la différence entre un destructeur virtuel et une méthode virtuelle.

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,
    Il n'y a pas de différence entre un destructeur virtuel et une fonction membre (normale) virtuelle.
    Enfin, si ce n'est que pour les destructeurs, ils n'ont pas le même nom dans la classe mère et la classe fille...

    Si tu as des soucis avec les fonctions virtuelles, tu peux lire ce tutoriel.
    En particulier la partie sur les fonctions virtuelles et fonctions génériques (template).

    Comprends bien que si une fonction membre template ne peut pas être virtuelle, une fonction membre non template d'une classe template peut l'être.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Juste une petite remarque pour être sur que tu ne l'aies pas oublié

    Retiens bien que, si tu as une classe prenant une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class DerivedInt : public Base<int>
    {
         /* ...*/
    };
    et une autre prenant une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class DerivedLong : public Base<long>
    {
         /* ...*/
    };
    DerivedInt et DerivedLong feront toujours partie de deux hiérarchies différentes, et ce, malgré le fait qu'un int soit convertible en long
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut
    Bonsoir,

    Citation Envoyé par Steph_ng8 Voir le message
    Comprends bien que si une fonction membre template ne peut pas être virtuelle, une fonction membre non template d'une classe template peut l'être.
    Ok merci tout s'éclaircit maintenant. Et ça me parait tout à fait logique !

    Merci pour toutes les réponses et précisions fournient.

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

Discussions similaires

  1. [MVVM] Bonne méthode pour réaliser de l'héritage/template
    Par uluquiorra dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 07/02/2013, 15h23
  2. Héritage, template et compilation
    Par Letinono dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2011, 17h47
  3. héritage template ,compilation
    Par carton99 dans le forum Débuter
    Réponses: 2
    Dernier message: 11/04/2010, 17h46
  4. héritage template (en guise de typedef)
    Par adrtod dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2010, 10h19
  5. Réponses: 8
    Dernier message: 18/06/2007, 15h06

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