問題:
次の C コード スニペットを考えてみましょう:
<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>
命令参照のベクトルが作成され、逆参照された値をプッシュバックすることによって Add オブジェクトがベクトルに追加されます。
<code class="cpp">vector<Instruction> v; Instruction* i = new Add(1,2,3); v.push_back(*i);</code>
別のクラスでは、ベクトルの最後の要素が取得され、実行メソッドが呼び出されます:
<code class="cpp">Instruction ins = v.back(); ins.execute();</code>
質問:
実行メソッドはその Add タイプを保持しますか?また、コードは正しく実行されますか?
答え:
いいえ、そうではありません。
ベクトル<命令>参照自体ではなく、命令参照のコピーを保存します。これは、Add オブジェクトがベクターにプッシュバックされると、参照のコピーが作成されることを意味します。
さらに、new 演算子は、Add オブジェクトにメモリを割り当てるために使用されます。ただし、オブジェクトは削除されないため、メモリ リークが発生します。
このシナリオを正しく実装するには、命令* または std::reference_wrapper のベクトルを使用する必要があります。
<code class="cpp">vector<Instruction*> ins;</code>
または
<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
補足:
この問題で説明されている動作は、オブジェクト スライスとして知られています。
以上がオブジェクトのスライスは C ベクトルのポリモーフィズムに影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。