Heim > Backend-Entwicklung > C++ > Wie kann Object Slicing vermieden werden, wenn abgeleitete Klassenobjekte in Basisklassenvektoren gespeichert werden?

Wie kann Object Slicing vermieden werden, wenn abgeleitete Klassenobjekte in Basisklassenvektoren gespeichert werden?

Patricia Arquette
Freigeben: 2024-12-23 19:49:14
Original
433 Leute haben es durchsucht

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

Objekt-Slicing im Speicher abgeleiteter Klassen

Beim Speichern von Objekten abgeleiteter Klassen in Vektoren, die für Basisklassen entwickelt wurden, kann es zu unerwartetem Verhalten kommen. Der Grund liegt im Objekt-Slicing, bei dem abgeleitete klassenspezifische Mitglieder abgeschnitten werden.

Beispiel:

#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;
}
Nach dem Login kopieren

Lösung: Basisklassenzeiger mit Smart speichern Zeiger

Um Objekt-Slicing zu vermeiden, speichern Sie Zeiger auf Basisklassenobjekte im Vektor. Verwenden Sie insbesondere intelligente Zeiger, um den Speicher effektiv zu verwalten:

// 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;
}
Nach dem Login kopieren

Durch die Verwendung von intelligenten Zeigern können Sie den Polymorphismus abgeleiteter Objekte beibehalten und gleichzeitig den Speicher ohne manuelle Zeigermanipulation nahtlos verwalten.

Das obige ist der detaillierte Inhalt vonWie kann Object Slicing vermieden werden, wenn abgeleitete Klassenobjekte in Basisklassenvektoren gespeichert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage