Kann Vector abgeleitete Klassenobjekte als Basisklassenvariablen speichern?
In C tritt ein verwirrendes Problem auf, wenn versucht wird, Objekte abgeleiteter Klassen zu speichern in Vektoren, deren Elemente vom Basisklassentyp sind. Wie im bereitgestellten Beispiel:
#include <iostream> #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); vect[0].identify(); return 0; }
Anstatt wie aufgrund des virtuellen Methodenversands erwartet „DERIVED“ auszugeben, gibt dieser Code „BASE“ aus. Dieses ungewöhnliche Verhalten ist auf Objekt-Slicing zurückzuführen.
Der Übeltäter: Objekt-Slicing
Objekt-Slicing bezieht sich auf den Verlust abgeleiteter klassenspezifischer Daten, wenn Speichern einer Instanz einer abgeleiteten Klasse in einer Variablen des Basisklassentyps. Dies liegt daran, dass der Compiler nur den gemeinsam genutzten Teil der Objekte kopiert und die abgeleiteten klassenspezifischen Mitglieder verwirft.
Eine alternative Möglichkeit mit Smart Pointern
Um das Objekt-Slicing zu überwinden Um polymorphes Verhalten zu erreichen, besteht die beste Vorgehensweise darin, Zeiger auf Basisklassenobjekte im Vektor zu speichern. Dadurch entfällt das Slicing, während die dynamische Natur der abgeleiteten Klassenmethoden erhalten bleibt.
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
Der C-Weg: Verwendung intelligenter Zeiger
Um den objektorientierten Ansatz zu verbessern, Es wird empfohlen, intelligente Zeiger anstelle von Rohzeigern zu verwenden. Intelligente Zeiger übernehmen die Speicherverwaltung automatisch und sorgen so für sicheren und sauberen Code.
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
Das obige ist der detaillierte Inhalt vonKönnen Vektoren abgeleitete Klassenobjekte ohne Objekt-Slicing enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!