ホームページ  >  記事  >  バックエンド開発  >  オブジェクトのスライスは C ベクトルのポリモーフィズムに影響しますか?

オブジェクトのスライスは C ベクトルのポリモーフィズムに影響しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 05:50:02837ブラウズ

Does Object Slicing Affect Polymorphism in C   Vectors?

C のベクトルとポリモーフィズム

問題:

次の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。