 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Guest
|
Posted: Thu Sep 08, 2005 4:21 pm Post subject: Destructeur virtuel |
|
|
Bonjour à tous,
j'ai un souci avec l'utilisation de classes dérivées, avec lesquelles
j'ai une erreur d'exécution à la destruction des objets.
Voici l'architecture de mes classes:
DS_Base DS_Base
| Quote: | |
public | public
|
DS_Graph DS_Graph
|
virtual public | virtual public
|
DS_Affich_Video_Base RendererPolicy
|
public | public
____________________________|
public
InitPolicy
public
DS_Affich_Video |
Je ne sais pas quels destructeurs rendre virtuels...
Selon cette page: http://jlecomte.ifrance.com/c++/c++-faq-lite/index-
fr.html, je devrai rendre virtuel le destructeurs de
DS_Affich_Video_Base, qui est la seule classe à utiliser des fonctions
virtuelles (pures).
Néanmoins, le fait que je dérive en virtual public de la classe DS_Graph
m'interroge sur le fait que je devrais peut-être rendre ses destructeurs
virtuels eux aussi...
Je tiens à préciser que tous ont des destructeurs triviaux (non-définis),
pour reprendre les termes de la FAQ.
Quelles sont les classes à retoucher?
Merci d'avance
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Sep 08, 2005 4:40 pm Post subject: Re: Destructeur virtuel |
|
|
On 08 Sep 2005 16:21:27 GMT, Michael
<michael_delva.enlever (AT) hotmail (DOT) com>:
| Quote: | Je ne sais pas quels destructeurs rendre virtuels...
|
Tous. D'une manière générale, si une classe C est prévue pour avoir
des classes dérivées, elle doit avoir un destructeur virtuel.
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri Sep 09, 2005 6:54 am Post subject: Re: Destructeur virtuel |
|
|
Michael wrote:
| Quote: | j'ai un souci avec l'utilisation de classes dérivées, avec
lesquelles j'ai une erreur d'exécution à la destruction des
objets.
Voici l'architecture de mes classes:
DS_Base DS_Base
| |
| public | public
| |
DS_Graph DS_Graph
| |
| virtual public | virtual public
| |
DS_Affich_Video_Base RendererPolicy
| |
| public | public
|____________________________|
|
| public
|
InitPolicy
|
| public
|
DS_Affich_Video
Je ne sais pas quels destructeurs rendre virtuels...
Selon cette page: http://jlecomte.ifrance.com/c++/c++-faq-lite/index-
fr.html, je devrai rendre virtuel le destructeurs de
DS_Affich_Video_Base, qui est la seule classe à utiliser des fonctions
virtuelles (pures).
Néanmoins, le fait que je dérive en virtual public de la
classe DS_Graph m'interroge sur le fait que je devrais
peut-être rendre ses destructeurs virtuels eux aussi...
Je tiens à préciser que tous ont des destructeurs triviaux
(non-définis), pour reprendre les termes de la FAQ.
|
Comme Fabien a dit, tous. Dès qu'il s'agit d'une hièrarchie
polymorphique, tous les destructeurs doivent être virtuels.
(Formellement, la règle, c'est que si tu fais delete sur un
pointeur de type T*, et que le type réel de l'objet n'est pas
T*, il faut que le destructeur soit virtuel. Donc, si tu ne fais
jamais de delete sur des DS_Base*, il n'y a pas besoin d'un
destructeur virtuel. Dans la pratique, en revanche, c'est plus
sûr de le mettre ; ça ne coûte prèsque rien, et ça te protège
quand même.)
Plusieurs points, néaumoins :
-- Si les classes DS_Base et DS_Graph n'ont pas de fonctions
virtuelles, pourquoi en dérives-tu publiquement ? Est-ce que
l'appartenance n'y conviendrait pas mieux ? (Sans savoir
plus, c'est difficile à dire. Mais si DS_Graph représente
une contexte graphique ou des outils qui servent à
l'affichage, et que des fonctions vrituelles comme draw() se
trouve dans DS_Affich_Video_Base, je ferais probablement que
DS_Affich_Video_Base contient un DS_Graph, et que les
fonctions de RendererPolicy en prend un en paramètre -- en
général, une classe avec Policy dans son nom n'a pas de
données, sauf peut-être des données de configuration de la
politique même. Je m'attendrais même qu'on pourrait en
partager la même instance entre tous les objets qui
utilisent la même politique.)
-- Si tu donnes un destructeur virtuel à DS_Base, tous les
autres destructeurs sont automatiquement virtuels.
-- Dès qu'il y a une fonction virtuelle, le destructeur n'est
pas trivial, au sens de la norme. Donc, a priori, tu n'as
pas de destructeurs triviaux. (Informellement, je crois
qu'on dit « vide » dans le cas où tu n'as pas de code à toi
à ajouter au destructeurs.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Michael Guest
|
Posted: Fri Sep 09, 2005 4:42 pm Post subject: Re: Destructeur virtuel |
|
|
Merci pour vos réponses!
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|