Destructeurs virtuels

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Destructeurs - Index

Il est possible de déclarer un destructeur virtual. Ceci autorise un pointeur sur un objet d'une classe de base à appeler le destructeur adéquat dans le cas où ce pointeur se réfère en réalité à un objet d'une classe dérivée. Le destructeur d'une classe dérivée d'une classe munie d'un destructeur virtual est lui-même virtual.



 /* Comment les destructeurs virtuels affectent l'ordre d'appel des destructeurs.
    Sans destructeur virtuel dans la classe de base, le destructeur de classe dérivé
    ne sera pas appelé. */
 #include <iostream>
 class color {
 public:
    virtual ~color() {  // destructeur virtuel
       std::cout << "color dtor\n";
       }
 };
 class red : public color {
 public:
    ~red() {  // Ce destructeur est aussi virtuel
       std::cout << "red dtor\n";
       }
 };
 class brightred : public red {
 public:
    ~brightred() {  // Ce destructeur est aussi virtuel
        std::cout << "brightred dtor\n";
        }
 };
 int main()
 {
    color *palette[3];
    palette[0] = new red;
    palette[1] = new brightred;
    palette[2] = new color;
    // Les destructeurs de red et color sont appelés
    delete palette[0];
    std::cout << std::endl;
    // Les destructeurs de brightred, red, et color sont appelés
    delete palette[1];
    std::cout << std::endl;
    // Le destructeur de color est appelé
    delete palette[2];
    return 0;
 }



Sortie du programme :



 red dtor
 color dtor
 brightred dtor
 red dtor
 color dtor
 color dtor



Si aucun destructeur n'est déclaré virtuel, delete palette[0], delete palette[1] et delete palette[2] n'appelleront tous que le destructeur de la classe color. Cela détruira de manière incorrecte les deux premiers éléments, qui sont en fait du type red et brightred.

Voir aussi