begin process at 2012 02 09 08:53:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > UTILITÉ DU DESTRUCTEUR VIRTUEL

UTILITÉ DU DESTRUCTEUR VIRTUEL


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Classé sous :destructeur, virtual, héritage, dérivée, base Niveau :Débutant Date de création :01/10/2006 Vu / téléchargé :13 584 / 200

Auteur : guilhemmartincpp

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code permet de comprendre l'utilité du destructeur virtuel. Il présente les 2 comportements différents obtenus en utilisant un destructeur virtuel et sans l'utiliser.

Le zip contient un projet CodeBlocks. Si vous utilisez un autre logiciel, il suffit de récupérer simplement le CPP.

Source

  • #include <iostream>
  • // On se sert de UneClasse pour observer le comportement de l'allocation et de la désollaction d'un objet dynamique au sein d'une autre classe (ici, A, B, C et D)
  • class UneClasse
  • {
  • public:
  • UneClasse()
  • {
  • std::cout << "Construction UneClasse" << std::endl;
  • }
  • ~UneClasse()
  • {
  • std::cout << "Destruction UneClasse" << std::endl;
  • }
  • };
  • class A
  • {
  • private:
  • UneClasse* UnObjet;
  • public:
  • A()
  • {
  • std::cout << "Construction A" << std::endl;
  • UnObjet=new UneClasse();
  • }
  • ~A() // DESTRUCTEUR NON VIRTUEL
  • {
  • std::cout << "Destruction A" << std::endl;
  • if(UnObjet!=NULL)
  • delete UnObjet;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis A" << std::endl;
  • }
  • };
  • class B:public A
  • {
  • public:
  • B()
  • {
  • std::cout << "Construction B" << std::endl;
  • }
  • ~B()
  • {
  • std::cout << "Destruction B" << std::endl;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis B" << std::endl;
  • }
  • };
  • class C
  • {
  • private:
  • UneClasse* UnObjet;
  • public:
  • C()
  • {
  • std::cout << "Construction C" << std::endl;
  • UnObjet=new UneClasse();
  • }
  • virtual ~C() // DESTRUCTEUR VIRTUEL
  • {
  • std::cout << "Destruction C" << std::endl;
  • if(UnObjet!=NULL)
  • delete UnObjet;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis C" << std::endl;
  • }
  • };
  • class D:public C
  • {
  • public:
  • D()
  • {
  • std::cout << "Construction D" << std::endl;
  • }
  • ~D()
  • {
  • std::cout << "Destruction D" << std::endl;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis D" << std::endl;
  • }
  • };
  • int main()
  • {
  • A *a=new A();
  • delete a;
  • std::cout << std::endl;
  • B *b=new B();
  • delete b;
  • std::cout << std::endl;
  • C *c=new C();
  • delete c;
  • std::cout << std::endl;
  • D *d=new D();
  • delete d;
  • std::cout << std::endl;
  • A * a_B = new B(); // construction de A et B mais attribution du pointeur à un objet de type A
  • a_B->QuiSuisJe(); // affiche "Je suis B"
  • delete a_B; // On s'aperçoit sur la console que la partie B n'est pas détruite
  • std::cout << std::endl;
  • C * c_D = new D(); // construction de C et D mais attribution du pointeur à un objet de type C
  • c_D->QuiSuisJe(); // affiche "Je suis D"
  • delete c_D; // On s'aperçoit sur la console que C et D sont bien détruits
  • return 0;
  • }
#include <iostream>


// On se sert de UneClasse pour observer le comportement de l'allocation et de la désollaction d'un objet dynamique au sein d'une autre classe (ici, A, B, C et D)
class UneClasse
{
public:
    UneClasse()
    {
        std::cout << "Construction UneClasse" << std::endl;
    }
    ~UneClasse()
    {
        std::cout << "Destruction UneClasse" << std::endl;
    }
};

class A
{
private:
    UneClasse* UnObjet;
    
public:
    A()
    {
        std::cout << "Construction A" << std::endl;
        UnObjet=new UneClasse();
    }
    ~A()  // DESTRUCTEUR NON VIRTUEL
    {
        std::cout << "Destruction A" << std::endl;
        if(UnObjet!=NULL)
            delete UnObjet;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis A" << std::endl;
    }
};

class B:public A
{

public:
    B()
    {
        std::cout << "Construction B" << std::endl;
    }
    ~B()
    {
        std::cout << "Destruction B" << std::endl;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis B" << std::endl;
    }
};


class C
{
private:
    UneClasse* UnObjet;
    
public:
    C()
    {
        std::cout << "Construction C" << std::endl;
        UnObjet=new UneClasse();
    }
    virtual ~C() // DESTRUCTEUR VIRTUEL
    {
        std::cout << "Destruction C" << std::endl;
        if(UnObjet!=NULL)
            delete UnObjet;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis C" << std::endl;
    }
    
};

class D:public C
{

public:
    D()
    {
        std::cout << "Construction D" << std::endl;
    }
    ~D()
    {
        std::cout << "Destruction D" << std::endl;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis D" << std::endl;
    }
};


int main()
{
    A *a=new A();
    delete a;
    
    std::cout << std::endl;
    
    B *b=new B();
    delete b;
    
    std::cout << std::endl;
    
    C *c=new C();
    delete c;
    
    std::cout << std::endl;
    
    D *d=new D();
    delete d;
    
    std::cout << std::endl;
       
    A * a_B = new B();   // construction de A et B mais attribution du pointeur à un objet de type A
    a_B->QuiSuisJe();    // affiche "Je suis B"
    delete a_B;          // On s'aperçoit sur la console que la partie B n'est pas détruite
    
    std::cout << std::endl;
    
    C * c_D = new D();   // construction de C et D mais attribution du pointeur à un objet de type C
    c_D->QuiSuisJe();    // affiche "Je suis D"
    delete c_D;          // On s'aperçoit sur la console que C et D sont bien détruits
    
    return 0;
}

 Conclusion

Pour bien comprendre, le mieux c'est d'exécuter le code soi-même...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   DestructeurVirtuel
    •   .objs
      • main.oTélécharger ce fichier [Réservé aux membres club]13 818 octets
    • desvir.cbpTélécharger ce fichier [Réservé aux membres club]839 octets
    • desvir.layoutTélécharger ce fichier [Réservé aux membres club]233 octets
  • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 711 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture ROGNER UNE IMAGE AVEC QT 4.0
Source avec Zip Source avec une capture UTILITÉ DES FONCTIONS VIRTUELLES
Source avec Zip Source avec une capture FONCTIONS DE STD::VECTOR
Source avec Zip Source avec une capture PRÉSENTATION DES FONCTIONS DE STD::LIST
Source avec Zip Source avec une capture [MFC] ONGLET À L'INTÉRIEUR D'UNE DIALOGUE

 Sources de la même categorie

LISTER FICHIERS ET RÉPERTOIRES (MULTIPLATEFORME) par christophedlr
UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip Source avec une capture QCSSCOMPRESSOR par alphaone
AFFICHAGE D'UN TRIANGLE ISOCELE par nabche
Source avec Zip GESTION D'UNE BIBLOTHEQUE par leclerro19

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture C++ CONSOLE APPLI : GESTION CABINET MÉDICAL par chakerTN
Source avec Zip VIRTOPROFESSOR: MRCARDO, UN APPRENTISSAGE RAPIDE DE VOS LEÇO... par soso62fr
CONVERTISSEUR DE NOMBRE DE BASE EN BASE par G3nt002008
Source avec Zip HÉRITAGE, COMPOSITION ET POLYMORPHISME par anadeveloppeur
Source avec Zip Source avec une capture UTILITÉ DES FONCTIONS VIRTUELLES par guilhemmartincpp

Commentaires et avis

Commentaire de Arnaud16022 le 10/10/2006 12:52:53

C'est gentil de nous faire part de tes "découvertes" :p

Commentaire de guilhemmartincpp le 10/10/2006 18:30:18

@Arnaud16022 : c'est ce que j'appelle un commentaire constructif :). Pour rappel ce code se trouve dans la rubrique tutoriel et débutant.  

Commentaire de Arnaud16022 le 14/10/2006 16:18:57

excuse j'étais un peu énervé ce jour là :/
le fait est que :
-je n'avais pas vu que c'était dans "tutos"
-le polymorphisme peut être en effet assez dur à comprendre
-mais l'un dans l'autre, les tutos à ce sujet ne manquent pas. cf cplusplus.com, la FAQ-lite de Marshal, le cours de Christian Casteyde, ...

Je pense que qqun qui ne connaît pas la virtualité et débarque sur ta source va se dire, erm c'est cool mais ca a l'air bien inutile.
Alors que justement c'est LE truc qui différencie C et C++ ( class::méthode(void) n'est au fond qu'une écriture facilitée de méthode(class * instance), idem pour les operators, les templates, etc )
Je pense que ce qui serait de loin plus intéressant , c'est un exemple d'utilisation concret avec une référence vers un cours de C++.
exemple :
Je vais vous monter comment réaliser un système de Widgets / un loader de modèles 3D / whatever /  facilement grâce a un truc génial du C++ : la vtable !

voilà :)
Sur ce, bonne continuation.
Arnaud

Commentaire de guilhemmartincpp le 15/10/2006 19:44:18

Merci pour tes remarques ! J'en tiendrai compte pour mes futurs uploads sur cppfrance.

@+

Commentaire de mohamed123 le 04/08/2008 12:48:16

Merci
ce code m'a aidé à comprendre une raison pour laquelle if faut avoir un destructeur virtuel dans une classe,
je me demande s'il y a d'autres?

Commentaire de Cuicui73 le 06/03/2009 00:08:04

Yop !

Bon, désolé, je sais que ce post à déjà quelques années, mais bon...

C'était pour 2 choses :
- Concernant le tuto, c'est vrai qu'il faut quand même se creuser les méninges pour bien le comprendre... Mais c'est bien utile donc bon... Et puis rien de mieux qu'une source pour illustrer, je regretterais juste qu'elle n'est pas très commentée... On ne vois pas au premier coup d'½il se qu'il passe vraiment concrètement, donc sa aurait put aider.
- Sinon, concernant le fichier Code::Blocks, sa aurait été mieux si l'exécutable se créait ailleurs que dans "C:\Documents and Settings\Guilhem Martin\Mes documents\MesDeveloppementsPersonnels\DestructeurVirtuel\desvir.exe"...!!
A bon entendeurs !  ;-D

Cuicui.

Commentaire de guilhemmartincpp le 10/03/2009 11:19:27

Hi Cuicui,
merci pour ton message.
Oups, pour le coup de CodeBlocks, je pensais qu'il utilisait des chemins en relatif ! Merci pour ta remarque...
@+

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Héritage et destructeur [ par vincemail ] Bonsoir à tous, j'aurai besoin de quelques précisions quant aux destructeurs d'une classe héritant d'une autre. J'ai une classe B qui hérite d'une cla destructeurs et virtual [ par magic_Nono ] Bj, Un des principes de la POO est de toujour faire pr&#233;c&#233;der le destructeur du mot clef virtual afin qu'il soit appeler meme si il y a h&#23 probleme thrtead (je galaire) [ par khamine ] salut tous le monde.j'ai essay&#233; de me connecter a une base de donn&#233;es dans un thread mais ca marche pas. alors j'ai cr&#233;e une nouvelle c Chargement de données [ par Horfee ] bonjour, Une question me taraude : je suis sur le point de me cr&#233;er une petite videotheque, en Win32 (pas de MFC) et une base de donn&#233;es acc registre de base [ par halwas ] bonne programationbonjour, je cherche &#224; savoir la marque de mon pc en utilisant la programmation et les registre de base .pa C++ destructeur et win32 (ou MFC ou autre surcouche) [ par magic_Nono ] MessageBox au sein du destructeur de la fenetre principale Bonjour! Pour les besoins d'un tests, j'ai essayer de faire une pause avant de d&#233;tr Besoin d'un peu d'aide sur l'héritage et les constructeurs [ par neodelphi ] Bonjour tout le monde, j'ai deux petites question &#224; propose du langage c++ sur l'h&#233;ritage et les constructeurs:Tout d'abord, je voudrai savo Pb de connexion à une BDD accès [ par cecel ] Salut, J'ai créer un projet win 32 qui se connecte a une base accès avec ADO. Voici le code : //ouverture de la base char connection[300]; sprintf(co question de "cours" : constructeurs de classe dérivée et classe de base [ par mhassine ] &nbsp;&nbsp;&nbsp;Bonjour,j'ai une classe personne et une classe etudiant d&#233;riv&#233;e de personne.J'ai le constructeur Personne(string n)J'ai au void Static Virtual CALLBACK ? [ par anarchysniper ] Je dois créer une classe Timer avec sorte de gestion évènementielle à la manière des "events" des classes .NET. Mais comme ces "events" doivent être m


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,388 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales