1

多くの人newが派生クラスのインスタンスを作成するために使用し、その後、いくつかのコンテナーのベースへのポインターを保持しているのを見ました。派生クラスごとにコンテナーを使用することに関して利点はありますか? これで私は次のようなことを意味しました

class A
  {
 public:
  vector<Base*> bases;
  set<Derived1> der1;
  set<Derived2> der2;
  //other stuff
  };

編集:質問の2番目の部分を削除し、コメントとして追加しました。

4

1 に答える 1

0

次のようにすると

vector<base*> bases;

その後、オブジェクトでポリモーフィズムを使用できます。Vehicle という基本クラスがあるとします。ポイント A からポイント B に移動するための move() メソッドがあります。

class Vehicule
{
  public:
    virtual void move(){}
}

次に、Car と Submarine の 2 つの派生クラスがあります。

class Car : public Vehicule
{
  public:
    void move()
    {
       checktires(); 
       drive();
    }
}

そしてあなたのサブクラス

class Submarine : public Vehicule
{
  public:
    void move()
    {
       submersion(); 
       propulsion();
    }
}

move メソッドは仮想メソッドであるため、ポリモーフィズムを実行します。これは、同じ関数を呼び出すことを可能にするメカニズムですが、オブジェクトの動的タイプに基づいて異なる動作をすることができます。

その文をできる限り説明しようと思います。Vehicule、Car、Submarine クラスができたので、Vehicule ポインターの配列 (またはベクターのような stl コンテナー) を作成します。

std::vector<Vehicule*> objects; 
objects.push_back(new Car());
objects.push_back(new Submarine());
objects[0]->move();
objects[1]->move();

move の最初の呼び出しは、Car メソッドで定義された move メソッドを呼び出します。2 つ目は、Submarine で定義された Move を呼び出します。Vehicule* のベクトルを持っている可能性がありますが、関数を呼び出すと、それが仮想であるため、適切なバージョンを呼び出すことになります。また、関数を 1 つだけ呼び出すと、さまざまな動作が得られます。Vehicle の派生クラスをいくつでも追加できますが、move メソッドを適応させるだけで済みます。

stackoverflow でポリモーフィズムを検索する必要があります。私が書いたものよりもはるかに詳細で正確な回答があります。

間違いをお詫びします。私は英語のネイティブ スピーカーではありません。

于 2013-06-26T20:38:42.887 に答える