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; }
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; }
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!