1

私はゲーム/シミュレーションに取り組んでおり、ゲーム内のすべてのクリーチャーを管理しています。基本クラスの Creature が 1 つあり、そこからさまざまな種類のクリーチャーが継承されます。

このコードの初期のバージョンでは、基本クラスを任意のクリーチャーのジェネリックとして単独で使用していましたが、ゲームに存在するすべてのクリーチャーの電話帳を保持するプライベートな静的ベクトルがありました。これはクリーチャーのコンストラクタによって処理され、新しいクリーチャーのアドレスがスタックに追加されました。十分に単純です。

私がメンタルブロックを感じているのは、継承を導入するときです。Creature クラスを基本クラスに適合させ (ベクトルを保護された状態に移動すると思いますか?)、そこから Monkey、Bear、Tiger の任意の子クラスを定義すると... Creature を継承するクラスは、Creature 親クラスのポインター ベクトルにも追加されますか? おそらくもっと直接的に言えば、これらの子クラスのいずれかのインスタンスを作成すると、親クラスのコンストラクターも呼び出されるのでしょうか?

私は正しい考えを持っていますか、またはこの行動を達成するために何をしなければなりませんか? 必要に応じて、より具体的な詳細を提供できます。

ありがとう。

--

このように物事を行う背後にある私の考えは、一例としてグラフィックスです。そうすれば、存在するすべてのクリーチャーを循環し、ポリモーフィズムを介して各クリーチャーの関数を呼び出して、スプライトや XY 位置などを返すことができます。

4

1 に答える 1

1

Creature*これは、ベクター内ではなくポインターを格納している限り、確実に機能しCreatureますstd::vector。そうしないと、ベクトルが Creature だけのためにスペースを予約し、サブクラスのすべての追加機能が破棄されるため、オブジェクトのスライスが発生します。

コンストラクターの呼び出しスタックに関しては、かなり単純です。

class A {
  private:
    int aField;
  public:
    A(int aField) : aField(aField) { }
};

class B : public A {
  private:
    int bField;
  public:
    B(int aField, int bField) : A(aField), bField(bField) { }
};
于 2013-10-15T16:58:12.883 に答える