Heim >Backend-Entwicklung >C++ >Funktioniert Polymorphismus mit Vektorreferenzen in C?
Bei der Arbeit mit Vektoren und Polymorphismus in C kann es vorkommen, dass der Typ des gespeicherten Objekts entscheidend ist. Betrachten Sie das folgende Beispiel:
<code class="cpp">struct Instruction { virtual void execute() { } }; struct Add : public Instruction { int a, b, c; Add(int x, int y, int z) { a = x; b = y; c = z; } void execute() { a = b + c; } }; vector<Instruction> v; Instruction* i = new Add(1, 2, 3); v.push_back(*i);</code>
In diesem Code wird ein Vektor von Basisklassenobjekten erstellt und ein Objekt einer abgeleiteten Klasse (Hinzufügen) als Referenz in den Vektor verschoben. Die Sorge entsteht, wenn auf die Funktion „Ausführen“ für dieses Objekt zugegriffen wird:
<code class="cpp">auto ins = v.back(); ins.execute(); // Will the object retain its Add type?</code>
Wird Polymorphismus funktionieren?
Nein, wird es nicht. Der Vektor speichert Werte, keine Referenzen. Wenn das Add-Objekt in den Vektor verschoben wird, wird es daher kopiert, was zu einem Objekt vom Typ „Instruction“ und nicht „Add“ führt.
Reference_wrapper
Um sicherzustellen, dass Da der Polymorphismus intakt bleibt, besteht ein Ansatz darin, std::reference_wrapper
<code class="cpp">vector<std::reference_wrapper<Instruction>> ins;</code>
Verhindern von Speicherlecks
Darüber hinaus weist der Code ein Add-Objekt dynamisch mit new zu, ohne es zu löschen, was zu einem Speicherleck führt . Um dies zu beheben, sollte der Code einen intelligenten Zeiger wie std::unique_ptr verwenden oder das Objekt manuell löschen, bevor es den Gültigkeitsbereich verlässt.
Das obige ist der detaillierte Inhalt vonFunktioniert Polymorphismus mit Vektorreferenzen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!