utilité de redéfinir le destructeur virtuel quand il n'y a rien a nettoyer
14 réponses
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
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 ?
On Thu, 13 Aug 2009 00:23:57 -0700 (PDT), James Kanze
<james.kanze@gmail.com>:
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.
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 ?
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"
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"
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"
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
Fabien LE LEZ wrote:
On Thu, 13 Aug 2009 00:23:57 -0700 (PDT), James Kanze
<james.kanze@gmail.com>:
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.
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
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.
On 11 août, 22:31, "Marc G" <mgueg...@metrica.fr> 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.
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.