
次の 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>別のクラス内:
<code class="cpp">void some_method() {
vector<Instruction> v;
Instruction* i = new Add(1,2,3)
v.push_back(*i);
}</code>そして別のクラス:
<code class="cpp">void some_other_method() {
Instruction ins = v.back();
ins.execute();
}</code>これらのクラスは命令ベクトルを共有します。ただし、execute 関数に関して懸念事項が発生します。 Add タイプは保持されますか?
残念ながら、保持されません。ベクトル参照ではなく値を保存します。これは、命令オブジェクトがある時点でコピーされることを意味し、「オブジェクトのスライス」と呼ばれる現象が発生します。
この問題を解決するには、vector の使用を検討してください。または、より効果的には、vector< std::reference_wrapper >.
以上がC で「vector」を使用するとオブジェクトのスライスが発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。