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.
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.
kanze
Michael wrote:
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
Michael wrote:
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
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