Objekt-Slicing im Polymorphismus: Speichern abgeleiteter Klassenobjekte in Basisklassenvariablen
Bei der Arbeit mit Vererbung in C kann es zu Problemen kommen Objektschneiden. Dies geschieht, wenn ein Objekt einer abgeleiteten Klasse einer Basisklassenvariablen zugewiesen wird, wodurch die abgeleiteten klassenspezifischen Mitglieder verloren gehen.
Betrachten Sie das folgende Beispiel:
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; }
Hier Im Code erwarten wir, dass die Methode „identify()“ „DERIVED“ ausgibt, da es sich um eine virtuelle Methode handelt. Allerdings wird stattdessen „BASE“ gedruckt. Dies liegt daran, dass das abgeleitete Objekt zerlegt wird, wenn es im Vect-Vektor gespeichert wird, der deklariert ist, Basisobjekte zu enthalten.
Um dieses Problem zu lösen und polymorphes Verhalten aufrechtzuerhalten, muss man einen Zeiger auf die Basisklasse im Vektor speichern anstelle des Objekts selbst:
vector<Base*> vect; vect.push_back(&derived); vect[0]->identify();
Jetzt zeigt vect[0] auf ein abgeleitetes Objekt und stellt so sicher, dass die Methode „identify()“ der abgeleiteten Klasse aufgerufen und gedruckt wird „DERIVED“.
Um diesen Ansatz weiter zu verbessern und manuelle Speicherverwaltung zu vermeiden, können intelligente Zeiger verwendet werden. Zum Beispiel:
vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>()); vect[0]->identify();
Dieser Ansatz stellt sicher, dass der Speicher für das abgeleitete Objekt automatisch verwaltet wird, wodurch der Code effizienter und weniger fehleranfällig wird.
Das obige ist der detaillierte Inhalt vonWie wirkt sich Object Slicing auf den Polymorphismus in C aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!