Heim >Backend-Entwicklung >C++ >Funktioniert Polymorphismus mit Vektorreferenzen in C?

Funktioniert Polymorphismus mit Vektorreferenzen in C?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 12:21:30889Durchsuche

Will Polymorphism Work with Vector References in C  ?

Polymorphismus und 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 zu verwenden, das Verweise auf Objekte anstelle von Objekten selbst speichert. Dies kann wie folgt implementiert werden:

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

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