Heim > Backend-Entwicklung > C++ > Können Vektoren abgeleitete Klassenobjekte ohne Objekt-Slicing enthalten?

Können Vektoren abgeleitete Klassenobjekte ohne Objekt-Slicing enthalten?

Susan Sarandon
Freigeben: 2024-12-27 02:27:10
Original
496 Leute haben es durchsucht

Can Vectors Hold Derived Class Objects Without Object Slicing?

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

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

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

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!

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