Heim >Backend-Entwicklung >C++ >Wie kann Object Slicing beim Arbeiten mit Vektoren von Vererbungshierarchien in C vermieden werden?

Wie kann Object Slicing beim Arbeiten mit Vektoren von Vererbungshierarchien in C vermieden werden?

DDD
DDDOriginal
2024-11-01 09:00:03946Durchsuche

How Can Object Slicing Be Avoided When Working with Vectors of Inheritance Hierarchies in C  ?

Vektoren und Polymorphismus in C: Object Slicing enträtselt

Beim Umgang mit Vektoren von Vererbungshierarchien in C kann man auf subtile Feinheiten stoßen, die das können beabsichtigtes Verhalten behindern. Betrachten Sie das folgende Beispiel:

<code class="cpp">class Instruction
{
public:
    virtual void execute() {  }
};

class Add: public Instruction
{
private:
    int a;
    int b;
    int c;
public:
    Add(int x, int y, int z) {a=x;b=y;c=z;}
    void execute() { a = b + c;  }
};</code>

Stellen Sie sich nun vor, ein Add-Objekt in einem Vektor von Basisklassenzeigern zu speichern:

<code class="cpp">void some_method()
{
    vector<Instruction*> v;
    Instruction* i = new Add(1,2,3)
    v.push_back(i);
}</code>

Später versuchen wir in einer separaten Methode, das aufzurufen Ausführungsfunktion für das letzte Element des Vektors:

<code class="cpp">void some_other_method()
{
    Instruction ins = v.back();
    ins.execute();
}</code>

Ein häufiges Missverständnis ist, dass sich die Ausführungsfunktion so verhält, als ob sie für ein Add-Objekt aufgerufen würde. Dies ist jedoch nicht der Fall.

Das Problem ergibt sich aus der Art und Weise, wie Vektoren Werte speichern: Sie speichern Kopien von Objekten, keine Referenzen. Wenn das Add-Objekt in den Vektor verschoben wird, wird es daher kopiert, was zu einem Objekt vom Typ „Instruction“ führt und die Add-spezifischen Daten und Methoden verliert. Dies wird als Objekt-Slicing bezeichnet.

Um Objekt-Slicing zu vermeiden, müssen wir unseren Vektor so ändern, dass er Referenzen anstelle von Kopien enthält:

<code class="cpp">vector<Instruction*> ins</code>

Alternativ können wir std::reference_wrapper verwenden:

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins</code>

Durch die Verwendung von Referenzen behalten wir den ursprünglichen Typ des Objekts innerhalb des Vektors bei und ermöglichen so das erwartete polymorphe Verhalten.

Das obige ist der detaillierte Inhalt vonWie kann Object Slicing beim Arbeiten mit Vektoren von Vererbungshierarchien in C vermieden werden?. 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