ホームページ >バックエンド開発 >C++ >C の命令オブジェクトのベクトルでポリモーフィズムが機能しないのはなぜですか?

C の命令オブジェクトのベクトルでポリモーフィズムが機能しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 14:41:29644ブラウズ

Why Doesn't Polymorphism Work with a Vector of Instruction Objects in C  ?

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

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