Maison > développement back-end > C++ > L'héritage de conteneurs C STL est-il risqué ?

L'héritage de conteneurs C STL est-il risqué ?

Barbara Streisand
Libérer: 2024-11-29 03:45:09
original
792 Les gens l'ont consulté

Is Inheriting from C   STL Containers Risky?

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 Tarifs ;, est une approche plus sûre. Cependant, ils proposent un cas d'utilisation spécifique pour explorer les dangers potentiels.

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;
}
Copier après la connexion

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 vous permettrait d'ajouter des fonctionnalités supplémentaires tout en exploitant le conteneur sous-jacent. Cette approche garantit également que le destructeur de votre nouvelle classe est correctement géré, quelle que soit l'implémentation du conteneur de base.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal