0

私のプログラムには、多くの継承されたクラスを持つ Base クラスがあります。これらの継承されたオブジェクト (または任意のコンテナー) のリストを保存する必要があります。これを行うために私が考えることができる唯一の方法は、いくつかの型列挙を含む Base クラスのリストを作成し、継承された型にダウン キャストすることです。

オブジェクトを常にキャストしなければならないことは、オブジェクトをコンテナに入れようとするだけの重いペナルティのように思えます。

他のオプションはありますか?キャスティングは見た目ほど悪くないですか?

助けてくれてありがとう!

4

2 に答える 2

9

仮想関数を介してポリモーフィズムを使用します。それが彼らの目的です。

#include <algorithm>
#include <functional>
#include <iostream>
#include <list>

using namespace std;

class A {
public:
  virtual void print() {
    cout << "This is an A object" << endl;
  }
};

class B : public A {
public:
  virtual void print() {
    cout << "This is a B object" << endl;
  }
};

class C : public A {
public:
  virtual void print() {
    cout << "This is a C object" << endl;
  }
};

class D : public B {
  // empty
};

int main() {
  std::list<A*> objects;
  objects.push_back(new A());
  objects.push_back(new B());
  objects.push_back(new C());
  objects.push_back(new D());

  for_each(objects.begin(), objects.end(), mem_fun(&A::print));

  return 0;
}

// outputs:
// This is an A object
// This is a B object
// This is a C object
// This is a B object
于 2012-04-17T01:01:56.017 に答える
1

基本クラスのすべてのサブクラスのリストをプログラムで取得する直接サポートされている方法はありません。

ある関数の呼び出しを介して登録することで各サブクラス自体を「アナウンス」させ、その関数に必要なデータを受け入れ/保存させることで、コードでそれを行うことができます。

ただし、オブジェクトを基本クラスから派生クラスに絶えずキャストしている場合は、ポリモーフィズムを最大限に活用していない可能性があります。

于 2012-04-17T00:47:52.017 に答える