Heim  >  Artikel  >  Backend-Entwicklung  >  Beeinflusst das Objekt-Slicing den Polymorphismus in C-Vektoren?

Beeinflusst das Objekt-Slicing den Polymorphismus in C-Vektoren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 05:50:02760Durchsuche

Does Object Slicing Affect Polymorphism in C   Vectors?

Vektoren und Polymorphismus in C

Problem:

Bedenken Sie den folgenden C-Codeausschnitt:

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

Ein Vektor von Anweisungsreferenzen wird erstellt und ein Add-Objekt wird dem Vektor hinzugefügt, indem sein dereferenzierter Wert zurückgeschoben wird:

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

In einer anderen Klasse wird das letzte Element des Vektors abgerufen und das Die Ausführungsmethode heißt:

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

Frage:

Wird die Ausführungsmethode ihren Add-Typ beibehalten und wird der Code korrekt ausgeführt?

Antwort:

Nein, wird es nicht.

Der Vektor Speichern Sie Kopien von Anleitungsreferenzen, nicht die Referenzen selbst. Dies bedeutet, dass beim Zurückschieben des Add-Objekts in den Vektor eine Kopie der Referenz erstellt wird.

Darüber hinaus wird der neue Operator verwendet, um Speicher für das Add-Objekt zuzuweisen. Da das Objekt jedoch nicht gelöscht wird, tritt ein Speicherverlust auf.

Um dieses Szenario korrekt zu implementieren, sollte man einen Vektor von Instruction* oder std::reference_wrapper>:

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

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

Zusätzlicher Hinweis:

Das in diesem Problem beschriebene Verhalten wird als Objekt-Slicing bezeichnet.

Das obige ist der detaillierte Inhalt vonBeeinflusst das Objekt-Slicing den Polymorphismus in C-Vektoren?. 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