Object Slicing und Polymorphismus in Vektorcontainern
Beim Umgang mit Vererbung in C ist es manchmal wünschenswert, Instanzen abgeleiteter Klassen in Containern zu speichern wie Vektoren. Der unkomplizierte Ansatz, einen Vektor zum Speichern von Basisklassenobjekten zu verwenden, kann jedoch zum Objekt-Slicing führen, bei dem abgeleitete klassenspezifische Daten verloren gehen.
Betrachten Sie das folgende Programm:
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; }
Das Code erstellt einen Vektor von Basisobjekten und speichert eine Instanz der Derived-Klasse. Wenn Sie jedoch die Methode „identify()“ für das gespeicherte Objekt aufrufen, wird „BASE“ anstelle von „DERIVED“ ausgegeben. Dies liegt daran, dass Objekt-Slicing auftritt, wenn das abgeleitete Objekt dem Basisvektorelement zugewiesen wird, was zum Verlust abgeleiteter spezifischer Daten führt.
Um Objekt-Slicing zu verhindern und polymorphes Verhalten beizubehalten, ist die bevorzugte Lösung die Verwendung von Zeigern zu Basisklassenobjekten im Vektor:
vector<Base*>
Dadurch wird sichergestellt, dass die abgeleiteten klassenspezifischen Daten intakt bleiben. Um eine manuelle Speicherverwaltung zu vermeiden, können außerdem intelligente Zeiger eingesetzt werden:
vector<std::shared_ptr<Base>>
Intelligente Zeiger sorgen für eine automatische Speicherverwaltung durch RAII (Resource Acquisition Is Initialization), was es zu einem robusteren und C-konformeren Ansatz macht.
Das obige ist der detaillierte Inhalt vonWie kann ich Object Slicing vermeiden, wenn ich Vererbung mit C-Vektoren verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!