4

例: Apple は基本の Fruit クラスから派生し、基本の FruitPicker クラスから派生したクラス ApplePicker があります。
ApplePicker クラスには があり、Fruit picker クラスにはievector<Apple> appleListへのポインタがあります。vector<Fruit>vector<fruit>* fruitList

ベクトルをこのポインターに設定できるようにする必要があるため、抽象メソッドをフルーツ ピッカー クラスで実行できます (フルーツ メンバーのみに関係するため)。しかし、これをやろうとしたときに、これを設定するのに問題があります:

this->fruitList = &(this->AppleList);

それは私にエラーを与えますcannot convert to vector<Apple> to vector<Fruit>。静的キャストを試しましたが、同じエラーが発生しました。ベクトル以外の基本クラスと派生クラスにも同様のことを行いましたが、問題ありませんでした。

私は C++ が初めてで、NDK 経由で Android で使用しています。

私がやろうとしていることは不可能であり、のようなポインターのベクトルを使用する必要がありますvector<Fruit*>

4

1 に答える 1

4

考えてみてください: ifvector<Apple>が代用できる場合vector<Fruit>(つまり、発生すると予想される変換が実際に正当である場合)、vector<Apple>を期待する関数に in 入力を提供できますvector<Fruit>

a を期待する関数は、そのベクターにvector<Fruit>a を追加する可能性があります。なぜなら、それは aであるからです (ベクトルがそのようなオブジェクトへのポインターではなく、タイプのオブジェクトを格納する場合にスライスが発生するという事実を今のところ無視しますが、それは別の話です) . その関数にa を渡すと、 の不変条件(つまり、リンゴだけを含むことができるという事実) が破られることになります。BananaBananaFruitFruitvector<Apple>vector<Apple>

OOP での継承は、あるタイプが別のタイプを普遍的に置換できる場合に機能します。置換できるという事実は、それAが を置換できるBという意味ではありません。V<A>V<B>

両方の種類のベクトルで動作する汎用ルーチンを作成する必要がある場合は、テンプレートを使用してコンパイル時の汎用性を実現します。

于 2013-04-06T10:20:20.640 に答える