Heim >Backend-Entwicklung >C++ >Wie kann Object Slicing in C vermieden werden, um polymorphes Verhalten zu erreichen?

Wie kann Object Slicing in C vermieden werden, um polymorphes Verhalten zu erreichen?

DDD
DDDOriginal
2024-12-26 04:33:10466Durchsuche

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

Objekt-Slicing und polymorphes Verhalten

Bei der objektorientierten Programmierung kann das Speichern abgeleiteter Klassenobjekte in Basisklassenvariablen zu unerwartetem Verhalten führen, das als bekannt ist Objektschneiden. Dieses Problem tritt auf, wenn der Basisklassenvariablen ein Objekt einer abgeleiteten Klasse zugewiesen wird, was dazu führt, dass die abgeleiteten klassenspezifischen Mitglieder aufgrund der Objektaufteilung verloren gehen.

Beispiel:

Betrachten Sie das folgende Programm:

#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;
}

In diesem Beispiel wird ein abgeleitetes Klassenobjekt in einem Vektor von Basisklassenobjekten vect gespeichert. Wenn Sie jedoch die Methode „identify()“ für das Basisklassenobjekt vect[0] aufrufen, wird „BASE“ anstelle des erwarteten „DERIVED“ ausgegeben.

Lösung:

Um Objekt-Slicing zu verhindern und polymorphes Verhalten zu erreichen, besteht der richtige Ansatz darin, einen Zeiger auf die Basisklasse in zu speichern Vektor:

vector<Base*> vect;

Durch die Verwendung eines Zeigers bleiben die abgeleiteten klassenspezifischen Mitglieder erhalten, was das gewünschte polymorphe Verhalten ermöglicht.

Verbesserte Lösung mit intelligenten Zeigern:

Um eine ordnungsgemäße Speicherverwaltung sicherzustellen, wird empfohlen, anstelle eines Raw einen geeigneten Smart Pointer zu verwenden Zeiger:

vector<unique_ptr<Base>> vect;

Dadurch wird sichergestellt, dass der Speicher für die Basisklassenobjekte automatisch mithilfe der Resource Acquisition Is Initialization (RAII) verwaltet wird, wodurch der Code effizienter und robuster wird.

Das obige ist der detaillierte Inhalt vonWie kann Object Slicing in C vermieden werden, um polymorphes Verhalten zu erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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