Suite à une discussion (lien), je me suis rendu compte que les classes de la STL ne déclarent pas leur destructeur virtuel.
Or, j'hérite de certaines de ces classes dans mon code (pour enrichir la liste des fonctions membres, ou tout simplement pour faciliter l'écriture) exemple :
En faisant des recherches, j'ai pu lire ça et là que c'était une mauvaise pratique, et j'aimerai savoir pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template<class T> class range : public std::pair<T, T> { public : range() {} range(const std::pair<T, T>& pair) : std::pair<T, T>(pair) {} };
Au final, le fait que le destructeur ne soit pas virtuel n'est pas grave, puisque dans tous les cas le destructeur de la classe dérivée ne fait strictement rien. Celui de std::pair<> sera toujours appelé, quoi qu'il arrive, donc pas de problème de ce côté là.
Est-ce une question de performances ?
Je sais que je peux utiliser une classe du style (c'est ce que je faisais au début) :
Dans le cas de conteneurs complexes (map, ...), c'est beaucoup de code pour pas grand chose, et ça implique plus de conversions/copies...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template<class T> class range { public : // Et là... oubligé de tout redéfinir ! private : std::pair<T, T> mRange; };
Partager