Heim > Backend-Entwicklung > C++ > Wie kann ich Object Slicing vermeiden, wenn ich Vererbung mit C-Vektoren verwende?

Wie kann ich Object Slicing vermeiden, wenn ich Vererbung mit C-Vektoren verwende?

Susan Sarandon
Freigeben: 2024-12-16 16:16:12
Original
794 Leute haben es durchsucht

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

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

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

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

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!

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