Heim > Backend-Entwicklung > C++ > Wie wirkt sich Object Slicing auf den Polymorphismus in C aus?

Wie wirkt sich Object Slicing auf den Polymorphismus in C aus?

Susan Sarandon
Freigeben: 2024-12-17 11:20:27
Original
413 Leute haben es durchsucht

How Does Object Slicing Affect Polymorphism in C  ?

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

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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!

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