Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

utilité de redéfinir le destructeur virtuel quand il n'y a rien a nettoyer

14 réponses
Avatar
Marc G
Bonsoir,
Tout ou presque est dans l'objet de ma question.
J'ai une hiérarchie de classes assez simples qui dérivent toutes de la même
classe de base
et auxquelles j'accède classiquement à partir de pointeurs alloués dans le
tas sur la classe de base.
Les destructeurs associés à ces classes ne font rien
=> d'où ma question : est-il utile de les définir et est-il utile dans ce
cas de définir un destructeur virtuel dans la classe de base.
A priori, ça fait des fonctions virtuelles inutiles (elles ne font rien) ?
Marc

4 réponses

1 2
Avatar
Fabien LE LEZ
On Thu, 13 Aug 2009 00:23:57 -0700 (PDT), James Kanze
:

Mais je crois comprendre que si je fais un delete à partir
d'un pointeur de la classe de base, le destructeur de celle-ci
doit être déclaré virtuel même dans ce cas...



Tout à fait. Dans la pratique, c'est grace au destructeur de la
classe la plus dérivée que le compilateur trouve l'adresse à
passer à la fonction operator new.



"operator delete", non ?
Avatar
Fabien LE LEZ
J'ai écrit :
Pour conclure et compléter mon message précédent : si une classe a au
moins une fonction virtuelle, son destructeur doit aussi être virtuel.
D'ailleurs, il me semble que g++ râle si ce n'est pas le cas.



Je confirme : avec le code ci-dessous :

struct B
{
virtual void f();
};

g++ -Wall -c -pedantic x.cpp indique :

"warning: 'struct B' has virtual functions but non-virtual destructor"
Avatar
Falk Tannhäuser
Fabien LE LEZ wrote:
On Thu, 13 Aug 2009 00:23:57 -0700 (PDT), James Kanze
:
Mais je crois comprendre que si je fais un delete à partir
d'un pointeur de la classe de base, le destructeur de celle-ci
doit être déclaré virtuel même dans ce cas...


Tout à fait. Dans la pratique, c'est grâce au destructeur de la
classe la plus dérivée que le compilateur trouve l'adresse à
passer à la fonction operator new.



"operator delete", non ?



Sans doute. Puis, c'est aussi grâce au destructeur de la classe
la plus dérivée que le compilateur trouve le bon opérateur delete
à appeler, dans le cas où celui-ci a été redéfini au niveau des
classes en question.

Falk
Avatar
Mathias Gaunard
On 11 août, 22:31, "Marc G" wrote:
Bonsoir,
Tout ou presque est dans l'objet de ma question.
J'ai une hiérarchie de classes assez simples qui dérivent toutes de l a même
classe de base
et auxquelles j'accède classiquement à partir de pointeurs alloués dans le
tas sur la classe de base.
Les destructeurs associés à ces classes ne font rien
=> d'où ma question : est-il utile de les définir et est-il utile d ans ce
cas de définir un destructeur virtuel dans la classe de base.



Ça dépend de si tu veux que le code suivant

struct A {};
struct B : A {};

int main()
{
A* a = new B;
delete a;
}

soulève un comportement indéfini ou pas.
1 2