2

こんにちは、配列に格納されている派生型を失うことなく、基本型の 2 次元配列内に派生型オブジェクトを格納することに小さな問題があります。

たとえば、次の Base クラスと Derived クラスがあります。

class Base{

}

class Derived: public Base{

}

次のように Base オブジェクトを作成するポイントがあります。

Base objectB;

次に、次のように、上記のオブジェクトを Derived クラスの型にキャストします。

Base *referencePointer = &objectB;
Derived *derivedPointer = static_cast<Derived*>(referencePointer);

この時点で、すべてが正しく機能しています (derivedPointer の型を出力すると、それは Derived 型です)。

これで、タイプ Base クラスの 2 次元配列が次のように初期化されました。

Base *baseArray[5][5];

ここで、次のように、derivedPointer 値を配列に入力します。

baseArray[x][y] = derivedPointer;

これは、referencePointer に格納するときに問題が発生する場所ですが、Base 型 (オブジェクトのスライス) になり、referencePointer 値を格納してその型を Base 型の配列内に保持する方法がわかりません。

どんな助けでも大歓迎です、

ありがとうございました!

4

2 に答える 2

1

タイプに基づいて異なる動きができるさまざまなタイプのプレーヤーがいるビデオゲームですが、それらはすべて同じ基本機能を持っています。

「特定の基本機能」が基本クラスに実装されていると想像してください。これらのメソッドは、パブリック メソッドまたはプロテクト メソッドとして、任意の派生クラスで簡単に使用できるようにすることができます。したがって、重複コードを排除します。

ここで、基本クラスが仮想メソッド「void move(CoordinatesXYZ_t to, VelocityXYZ_t vel, AccelerationXYZ_t acc)」を提供するとします。

派生クラスに同じシグネチャを持つ (仮想) メソッドを追加するだけで、各派生オブジェクトは、ゲーム エンジンの移動コマンドに対して独自の応答を提供できます。ゲーム エンジンが派生オブジェクトのタイプを認識する必要はありません。正しい仮想メソッドが呼び出されます。

ダウンキャストは単に必要ありません。ゲーム エンジンは、派生オブジェクトがインターフェイスに準拠している限り、処理する派生クラスの種類を気にする必要がないように記述できます。ゲーム エンジンは仮想メソッドを呼び出します。これにより、適切な派生オブジェクト メソッドが呼び出されます。

実際のメソッドは、ベース ポインターの 2 次元配列のすべてのメンバーに対して一意にすることができます。

実際のメソッドは何もできません (つまり、ツリーはおそらく動かないでしょう)。

また、派生クラスは、必要な動作が基本クラスの move メソッドが提供するものと異なる場合を除き、move メソッドを提供する必要はありません。

于 2014-03-11T00:18:29.213 に答える