Afficher : Delphi C++
Préférences d'affichage

Destructeurs virtuels

De RAD Studio

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

Autres langues