Maison > développement back-end > C++ > Devriez-vous hériter des conteneurs C STL : risques et alternatives ?

Devriez-vous hériter des conteneurs C STL : risques et alternatives ?

DDD
Libérer: 2024-11-26 14:13:10
original
1031 Les gens l'ont consulté

Should You Inherit from C   STL Containers: Risks and Alternatives?

Risques liés à la dérivation à partir de conteneurs C STL

Malgré les avantages potentiels de la dérivation de classes à partir de conteneurs C STL, tels que la surcharge de fonctions, la spécialisation des modèles et un débogage amélioré, il existe des risques inhérents associés à cette approche.

Considérez les points suivants exemple :

#include <vector>

class Rates : public std::vector<double> { };
class Charges : public std::vector<double> { };

int main() {
  auto p1 = new Rates;
  auto p2 = new Charges;
  kill_it(p2); // User code that knows nothing about Rates or Charges
  kill_it(p1);
  return 0;
}
Copier après la connexion

La fonction kill_it supprime la mémoire de la victime lors de l'exécution du destructeur non virtuel de std::vector. Cela peut entraîner des problèmes potentiels avec Charges (la classe dérivée) mais pas avec Rates (le typedef).

Le problème se pose si l'utilisateur introduit par inadvertance des erreurs dans la fonction kill_it ??? section. Par exemple, si l'utilisateur modifie p2 pour pointer vers un objet Rates avant d'appeler kill_it(p2), le destructeur non virtuel de std::vector sera appelé, entraînant un comportement incorrect.

Pour atténuer ce risque, il est généralement recommandé d'utiliser la composition au lieu de la dérivation lors de la manipulation des conteneurs STL. La composition permet une approche plus flexible et moins sujette aux erreurs.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal