Destructeurs virtuels
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.