C でベクトルとポリモーフィズムを扱う場合、格納されているオブジェクトの型が重要になる状況に遭遇することがあります。次の例を考えてみましょう。
<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>
このコードでは、基本クラス オブジェクトのベクトルが作成され、派生クラス (Add) のオブジェクトが参照としてベクトルにプッシュされます。このオブジェクトの「実行」関数にアクセスするときに次のような懸念が生じます:
<code class="cpp">auto ins = v.back(); ins.execute(); // Will the object retain its Add type?</code>
ポリモーフィズムは機能しますか?
いいえ、機能しません。ベクトルには参照ではなく値が格納されます。したがって、Add オブジェクトがベクターにプッシュされるとコピーされ、Add ではなく命令タイプのオブジェクトが生成されます。
Reference_wrapper
ポリモーフィズムはそのまま残りますが、1 つのアプローチは、オブジェクト自体ではなくオブジェクトへの参照を格納する std::reference_wrapper
<code class="cpp">vector<std::reference_wrapper<Instruction>> ins;</code>
メモリ リークの防止
さらに、コードは Add オブジェクトを削除せずに new で動的に割り当てるため、メモリ リークが発生します。 。これを修正するには、コードで std::unique_ptr などのスマート ポインターを使用するか、スコープ外になる前にオブジェクトを手動で削除する必要があります。
以上がポリモーフィズムは C のベクトル参照で機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。