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.