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