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 :

héritage et destructeurs virtuels.


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut héritage et destructeurs virtuels.
    Bonjour,

    J'essaye de comprendre le fonctionnement de destructeurs virtuels.
    Si on considère une classe de base et une classe héritée de cette classe, alors il risque d'y avoir des problèmes si il n'y a pas de destructeurs virtuels.
    Je suis d'accord, cela semble logique.

    J'ai décidé de mettre en application ce qui est écrit, avec l'héritage suivant.

    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
     
    class TimeKepper{
    private:
    	int o;
    public:
    	TimeKepper(int u):o(u){};
    	   ~TimeKepper();
    };
    TimeKepper::~TimeKepper(){
    	cout<<"~TimeKepper()";
    }
     
    class AtomicClock:public TimeKepper{
    public:
       int k;
    public:
    	AtomicClock(int i,int j):TimeKepper(i),k(j){};
    	static AtomicClock* getAtomicClock();
    	~AtomicClock(){
    	cout<<"ee";
    	};
    };
     
    void main(){
     
     
     int *o;
    	AtomicClock  *pta=new AtomicClock(9,8);
    	{
    		TimeKepper  *ptkk=0;
    		o=&(pta->k);	
    		ptkk=pta;
     
    delete ptkk;
    	}
    }
    Normalement, ptkk ne devrait prendre en compte que la partie de base de l'objet pointé par pta.

    Quand on fait delete ptkk, celui-ci ne devrait détruire que la partie de base de l'objet pointé par pta, laissant dans la mémoire la partie héritée. Ce qui fait que l'on pourrait toujours avoir la valeur 8 via *o. Or, ceci n'est pas le cas, car malgré l'absence de destructeurs virtuels, on ne peut plus lire la valeur de *o après la destruction. Qu'il y ait destructeur virtuel ou non, cela ne change rien. Je ne comprends pas pq.


    (c'est pourtant exactement ce que fait scott meyers dans son livre pour
    illustrer ce risque).


    j'ai fait cela car je m'attendais, dans la mémoire, à ne trouver que 00 00 08, et pas 00 00 09 00 00 08 après le passage de delete

    Merci

  2. #2
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    voila d'ailleurs ce que dit scott meyers:


    There are lots of ways to keep track of time, so it would be reasonable to create a TimeKeeper base class along with derived classes for different approaches to timekeeping:

    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
     
    class TimeKeeper {
     
    public:
     
      TimeKeeper();
     
      ~TimeKeeper();
     
      ...
     
    };
    class AtomicClock: public TimeKeeper { ... };
    class WaterClock: public TimeKeeper { ... };
    class WristWatch: public TimeKeeper { ... };

    Many clients will want access to the time without worrying about the details of how it's calculated, so a factory function — a function that returns a base class pointer to a newly-created derived class object — can be used to return a pointer to a timekeeping object:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TimeKeeper* getTimeKeeper();       // returns a pointer to a dynamic-
     
                                       // ally allocated object of a class
     
                                       // derived from TimeKeeper
    In keeping with the conventions of factory functions, the objects returned by getTimeKeeper are on the heap, so to avoid leaking memory and other resources, it's important that each returned object be properly deleted:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TimeKeeper *ptk = getTimeKeeper();  // get dynamically allocated object
                                        // from TimeKeeper hierarchy
    ..                                 // use it
    delete ptk;                        // release it to avoid resource leak

    . If getTimeKeeper were to return a pointer to an AtomicClock object, the AtomicClock part of the object (i.e., the data members declared in the AtomicClock class) would probably not be destroyed, nor would the AtomicClock destructor run. However, the base class part (i.e., the TimeKeeper part) typically would be destroyed, thus leading to a curious "partially destroyed" object. This is an excellent way to leak resources, corrupt data structures, and spend a lot of time with a debugger.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ton programme présente un comportement indéterminé car le destruteur de TimeKepper n'est pas virtuel.

    Ne cherche donc pas à déduire une loi générale, tu ne peux pas ^^ .
    Tu peux tomber sur le cas de l'objet à moitié détruit, mais pourquoi de celui de l'objet totalement détruit, tu ne peux pas prévoir.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ton programme présente un comportement indéterminé car le destruteur de TimeKepper n'est pas virtuel.
    je sais bien. C'est justement ce que j'ai envie de faire. Mais dois-je en déduire que, bien que cela ne puisse pas se voir, il y a comportement indéterminé car il n'y a pas de destructeur virtuel.

    Dès qu'une classe est héritée d'une autre classe ==> destructeur virtuel??

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    je sais bien. C'est justement ce que j'ai envie de faire. Mais dois-je en déduire que, bien que cela ne puisse pas se voir, il y a comportement indéterminé car il n'y a pas de destructeur virtuel.
    Oui, c'est précisé dans la norme.
    Dès qu'une classe est héritée d'une PUBLIQUEMENT autre classe ==> destructeur virtuel??
    Oui. La FAQ contient une entré là dessus.

    Dans les cas des autres héritages, on peut pas upcaster (faire passer un objet de type dérivé pour un objet de type base, le problème, ne se pose donc pas)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ou si il est non virtuel alors protected...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    un destructeur protected??
    ca existe ca?

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Un bout de code étant toujours plus clair :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct C
    {
          protected :
             ~C();
    }
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par deubelte Voir le message
    un destructeur protected??
    ca existe ca?
    Oui, cela existe...

    C'est à utiliser si:
    • Tu veux qu'une classe dérivée hérite (publiquement) de la classe pour laquelle tu définis ton destructeur en protégé (mais non virtuelle)
    • tu prévois d'interdire la destruction des objets dérivés lorsqu'il passent pour être des objet de la classe de base.

    Lorsque le destructeur d'une classe de base est protégé, celui de la classe dérivée peut y accéder (parce que les éléments protégés de la classe de base sont accessibles depuis les fonctions de la classe dérivée), par contre, il t'est impossible d'invoquer la destruction depuis un pointeur ou une référence sur le type de base, car seuls les membres et les fonctions publiques sont accessibles "depuis l'extérieur de la classe".

    De plus, si tu décides de définir le destructeur comme membre protégé, il y a de fortes chances que tu doives également définir le constructeur comme membre protégé également: Il serait en effet risqué de permettre la construction d'un objet... que l'on ne pourrait pas détruire

    Ainsi, avec deux classes proches de
    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
    class Base
    {
        /*blabla */
        protected:
            /* le destructeur protégé est accessible depuis Derivee
             * (et sera atomatiquement appelé depuis le destructeur 
             * cette dernière
             */
            ~Base(){}
    };
    class Derivee : public Base
    {
        /* si on ne met rien, le destructeur est, par défaut,
         * non inline et non  virtuel :D
         */
    };
    tu arrives à une situation proche de
    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
    int main()
    {
        Derivee d; /* aucun problème */
        Base b; /* DANGER: le constructeur de Base est accessible 
                    * depuis l'extérieur, et l'on peut donc déclarer une variable
                    * de type Base
                    */
        Base *ptrD = new Derivee; /* CRAC...*/
        Base * p2=&d; /* aucun problème ici :D*/
        /*...*/
        delete ptrD; /* BOUM : ~Base est protégé dans ce contexte */
        delete p2; /*surtout pas : p2 n'a pas été créé avec new */
    } /* 1- Destruction de d : pas de problème
       * 2- tentative de destruction de b : BOUM : ~Base est protégé 
       */
    Il est à noter qu'il est même possible de définir un constructeur et un destructeur comme membres privés, par exemple, pour créer un singleton (faut-il te remettre en garde contre cet anti-pattern ), mais que, à ce moment là, il faudra prévoir une fonction membre statique publique capable d'appeler le constructeur, et, vraisemblablement une fonction membre statique publique pour le détruire (dépendant de la manière dont tu implémente le singleton)
    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

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par deubelte Voir le message
    un destructeur protected??
    ca existe ca?
    La visibilité publique, protégée ou privée d'une fonction détermine juste dans quel contexte son appel sera autorisé ou non par le compilateur. N'importe quelle fonction peut avoir n'importe quelle des trois visibilités selon le sens que l'on souhaite lui donner.

    Quand à ta question initiale, outre le problème du virtuel, je ne comprend pas très bien ton test. Ton destructeur ne fait qu'une écriture sur la sortie et tu ne sais rien (parce que le langage ne te dit rien, il s'agit d'un détail d'implémentation de ton gestionnaire de mémoire (os+compilo)) des conséquences de delete. Donc en quoi l'image mémoire de ton objet peut-elle t'informer de ce qui se passe ?

  11. #11
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    en fait, je ne comprends pas vraiment la gestion de la mémoire.
    J'ai un cas très simple, que je ne comprends pas:

    Quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(){
    {int o=3;
    }
    int p=4;
    }
    alors si je me place à l'adresse mémoire &o, on a :
    0x001AFDBE  cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ
    0x001AFDD4  03 00 00 00 cc cc cc cc 2c fe 1a 00 ef 16 90 00 01 00 00 00 78 14  ....ÌÌÌÌ,þ..ï.......x.
    0x001AFDEA  89 00 a0 1b 89 00 ee 6b 26 73 00 00 00 00 00 00 00 00 00 b0 fd 7f  ..*...îk&s.........°ý.
    0x001AFE00  64 7a da 00 00 00 00 00 00 00 00 00 00 00 1b 00 00 00 00 00 f0 fd  dzÚ.................ðý
    0x001AFE16  1a 00 26 00 00 00 70 fe 1a 00 69 10 90 00 82 f9 ac 73 00 00 00 00  ..&...pþ..i....ù¬s....
    0x001AFE2C  34 fe 1a 00 1f 15 90 00 40 fe 1a 00 33 38 21 76 00 b0 fd 7f 80 fe  4þ......@þ..38!v.°ý.€þ
    on voit bien la présence de 03, au début de la deuxième ligne, (qui correspond à l'adresse de o). Quand on quitte la portée intérieure, je m'attendais à ce que la variable o soit supprimée. Or, on voit toujours le 03 au début de la ligne. Malgré cela, on a toujours la présence du 03.
    Ainsi, après avoir passé la ligne p=4, on a:

    04 00 00 00 cc cc cc cc cc cc cc cc 03 00 00 00

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    La variable prend de l'espace mémoire dans la fonction dans le sens où... il faut bien pouvoir en représenter la valeur

    Ce qui se passe, c'est que la variable devient inaccessible une fois que l'on atteint l'accolade fermante, par contre, comment voudrait tu supprimer "physiquement" une variable d'une série d'instructions qui... ne sera plus modifié

    Soit la variable existe dans le code binaire, et elle peut, dans la portée où elle est accessible, être utilisée pour y placer une valeur, soit la variable n'existe pas dans le code binaire, et on ne peut simplement pas l'employer...

    Enfin, ce n'est pas sur l'utilisation d'un simple type primitif que tu dois baser ton observation, mais plutôt sur une classe, de manière à observer que le destructeur est appelé au moment où l'on quitte la portée de la variable (et encore: il est préférable d'observer cela en assembleur, car, dans le code binaire, tu auras du mal à remarquer l'appel )
    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

  13. #13
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Enfin, ce n'est pas sur l'utilisation d'un simple type primitif que tu dois baser ton observation, mais plutôt sur une classe, de manière à observer que le destructeur est appelé au moment où l'on quitte la portée de la variable
    C'est ce que j'ai fait. J'ai testé avec une classe dans le cas d'allocations dynamiques, avec new, et quand on appelle le destructeur dans ce destructeur l'opérateur delete. Dans ce cas, on voit bien l'objet disparaitre.

    Mais dans le cas d'allocation statique, l'objet reste dans la mémoire.

    comment voudrait tu supprimer "physiquement" une variable d'une série d'instructions qui... ne sera plus modifié
    N'est ce pas ce qui se passe avec new/delete?

  14. #14
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Ce que devient la mémoire après sa libération qu'elle soit explicite (delete) ou implicite (variable sur la pile) ne relève pas du C++ mais du système. Si ce sujet t'intéresse, c'est du côté système que tu dois regarder comment c'est gérer.

  15. #15
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Si ce sujet t'intéresse, c'est du côté système que tu dois regarder comment c'est gérer.
    oui ca m'intéresse. Je pense que la gestion de la ressource mémoire est très importante pour un développeur. J'ai windows vista. Mais où chercher de la doc dans ce domaine?

  16. #16
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par deubelte Voir le message
    oui ca m'intéresse. Je pense que la gestion de la ressource mémoire est très importante pour un développeur.
    Jusqu'à un certain point uniquement...

    Oui, tu dois gérer ta mémoire "aussi finement" que possible en veillant à libérer la mémoire de ce qui est devenu inutiles "en temps opportun", mais, passé un certain point, tu sera bloqué par les mécanismes de l'OS, et tu pourra dancer sur ta tête, tu ne pourra plus influer sur la manière dont ces mécanismes fonctionnent effectivement.

    Ton role à toi, en tant que développeur, c'est:
    • de ne pas prévoir 150 000 éléments dans un tableau si... 15 suffisent
    • de veiller à libérer correctement tes ressources quand elles deviennent inutiles
    • de choisir les structures adaptées à l'utilisation que tu fait de tes données / collections
    • de fournir une logique aussi bonne que possible
    Si, déjà, tu remplis ces quatre points, ton développement sera bon
    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

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Et dans le cas ou ne définie pas de destructeur (c'est le compilateur qui le génère), ca va aussi poser problème???

  18. #18
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    En pratique on s'en sert pourquoi du destructeur protégé ?

  19. #19
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    En pratique on s'en sert pourquoi du destructeur protégé ?
    Justement, quand tu envisage une relation EST-UN, mais que tu ne devra jamais utiliser de la destruction polymorphe...

    Tu va donc utiliser tes classes dérivées en tant que telles et non en les faisant passer pour des objet du type de la classe de base.
    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

  20. #20
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    oui exact! merci

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

Discussions similaires

  1. probleme sur destructeur virtuel
    Par exhortae dans le forum C++
    Réponses: 5
    Dernier message: 01/03/2008, 07h32
  2. héritage et méthodes virtuelles ?
    Par Didine981 dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2007, 13h43
  3. Destructeur virtuel et cascade
    Par buzzkaido dans le forum C++
    Réponses: 5
    Dernier message: 23/06/2007, 11h23
  4. Réponses: 16
    Dernier message: 21/05/2007, 01h04
  5. Exceptions, héritage et méthodes virtuelles
    Par Nuwanda dans le forum C++
    Réponses: 13
    Dernier message: 23/05/2006, 12h06

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