ホームページ >バックエンド開発 >C++ >ポリモーフィズムは C のベクトル参照で機能しますか?

ポリモーフィズムは C のベクトル参照で機能しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 12:21:30887ブラウズ

Will Polymorphism Work with Vector References in C  ?

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

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

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