Maison >développement back-end >C++ >Comment éviter le découpage d'objets lors du stockage d'objets de classe dérivés dans des vecteurs de classe de base ?

Comment éviter le découpage d'objets lors du stockage d'objets de classe dérivés dans des vecteurs de classe de base ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-23 19:49:14427parcourir

How Can Object Slicing Be Avoided When Storing Derived Class Objects in Base Class Vectors?

Découpage d'objets dans le stockage de classes dérivées

Lors du stockage d'objets de classes dérivées dans des vecteurs conçus pour les classes de base, on peut rencontrer un comportement inattendu. La raison réside dans le découpage des objets, où les membres dérivés spécifiques à la classe sont tronqués.

Exemple :

#include <vector>
using namespace std;

class Base { public: virtual void identify() { cout << "BASE" << endl; } };
class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } };

int main() {
  Derived derived;
  vector<Base> vect;
  vect.push_back(derived); // Object slicing occurs here
  vect[0].identify(); // Unexpectedly prints "BASE"
  return 0;
}

Solution : stocker les pointeurs de classe de base avec Smart Pointeurs

Pour éviter le découpage d'objets, stockez les pointeurs vers les objets de classe de base dans le vecteur. Plus précisément, utilisez des pointeurs intelligents pour gérer efficacement la mémoire :

// Include smart pointer library
#include <memory>

// Replace raw pointers with smart pointers
vector<shared_ptr<Base>> vect;

int main() {
  Derived derived;
  vect.push_back(make_shared<Derived>(derived));
  vect[0]->identify(); // Properly prints "DERIVED"
  return 0;
}

En utilisant des pointeurs intelligents, vous pouvez conserver le polymorphisme des objets dérivés tout en gérant de manière transparente la mémoire sans manipulation manuelle du pointeur.

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!

Déclaration:
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