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>
ここで、命令クラスは仮想実行メソッドを定義しており、これはクラスを追加します。
次に、命令オブジェクトを含むベクトルを作成しましょう:
<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 オブジェクトがベクターにコピーされ、オブジェクトがスライスされることを意味します。
修正方法
多態性を維持するには、ベクターを使用する必要があります。ポインターの数:
<code class="cpp">vector<Instruction*> v; v.push_back(i);</code>
あるいは、std::reference_wrapper<命令>:
<code class="cpp">vector<std::reference_wrapper<Instruction>> v; v.push_back(i);</code>
のベクトルを使用することもできます。これにより、オブジェクトがスライスされず、保持できるようになります。それらの動的タイプと仮想関数を正しく呼び出します。
以上がC の命令オブジェクトのベクトルでポリモーフィズムが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。