Risques d'héritage de conteneurs C STL
La question posée est de savoir s'il existe des risques réels associés à l'héritage de conteneurs C standard. L'auteur soutient que l'utilisation d'un typedef, tel que typedef std::vector
Cas d'utilisation
Considérez l'extrait de code suivant :
#include <vector> #include <iostream> void kill_it(std::vector<double>& victim) { delete &victim; } typedef std::vector<double> Rates; class Charges: public std::vector<double> { }; int main() { std::vector<double>* p1, *p2; p1 = new Rates; p2 = new Charges; kill_it(p2); kill_it(p1); return 0; }
Le L'auteur suggère qu'un utilisateur arbitrairement malchanceux pourrait introduire une erreur dans le fichier ??? section qui poserait un problème avec Charges (la classe dérivée), mais pas avec Rates (le typedef).
Destructeurs virtuels
Le problème clé ici est cette norme Les conteneurs C n'ont pas de destructeurs virtuels. Par conséquent, vous ne pouvez pas les gérer de manière polymorphe. Si vous et tous les utilisateurs de votre code adhérez à ce principe, il n’est pas fondamentalement mauvais d’hériter de conteneurs standards. Cependant, l'auteur recommande la composition pour plus de clarté.
Composition sur héritage
Au lieu d'hériter d'un récipient, il est plus propre et plus sûr d'utiliser la composition. Cela implique la création d'une nouvelle classe contenant une instance du conteneur en tant que variable membre. Cela permet plus de flexibilité et de contrôle sur les fonctionnalités de votre classe.
Dans ce cas d'utilisation, par exemple, définir une nouvelle classe Rates qui contient une instance de std::vector
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!