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

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

Patricia Arquette
Freigeben: 2024-11-02 05:50:02
Original
847 Leute haben es durchsucht

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

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

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

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

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
Nach dem Login kopieren

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!

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