0

すべての派生クラスを変更する以外に、問題の解決策を見つけることができません。

から継承するBaseクラスと約1000のクラスがあります。ここで、クラス ポインターのベクトルを含む別のクラス say があります。DerivedBaseContainerBasestd::vector<Base *> derivList

上記のリストには、作成後のすべての派生クラス オブジェクトのアドレスが入力されます。

すべてのファイルは異なる翻訳単位にあります。

私がしたいこと

1)異なる派生クラスを指しているコンテナー内のベクトルの要素を使用して、Baseクラスからクラスの単一の関数を呼び出すことができるようにします。Container

2)しかし、この関数を呼び出すと、その関数内で、クラス ポインターが指しているpublic membersDerivedのクラスにアクセスできるようになるはずです。Base

class Base
{
  public: 
    virtual void someMethod();
    void containerCallsThisMethod();
};
void Base::containerCallsThisMethod()
{
  // I need to access the public functions of derived classes here
  // say: Derived1::calc(), Derived2::calc,.( I don't have derived class names here in  Base)
}

class Derived1:public Base
{
   public:
      void calc();
};

class Container
{
    std::vector<Base *> derivList;
    void execute();
};

void Container::execute()
{
    for(i = 0; i < derivList.size();i++)
    {
      derivList[i]->containerCallsThisMethod();
    }
}

私の制約は次のとおりです。

  • クラスをタッチするのDerivedは面倒なのでやるべきではありませんが、Baseクラスを変更することはできます。
  • BaseDerivedクラスのリスト (前方宣言でさえも) を持つことはできません。

関数の型があり、派生クラスのオブジェクトを指しているので、thisポインターを介して実行できると思いました。しかし、を使用してクラス メソッドを呼び出すことができません。ClassNamenon-constDerivedthis

多くの労力、特定の設計パターン、またはハックなしでこれを行う方法はありますか?

4

3 に答える 3

0

派生クラスを持つ基本クラスがある場合、これらの派生クラスは関数をオーバーライドし、呼び出すことができますfunc()。その後、そのオーバーライドfunc()が呼び出されます。私が見つけることができる限り、あなたが望むものに対する唯一の解決策は、派生クラスの良好な動作を中継するかfunc()、静的関数として配置するか、フレンドクラスに配置するか、静的内部クラスに配置することです。

于 2013-08-07T11:15:00.117 に答える
0

私があなたを正しく理解していればcalc、 で (おそらくprotected) 仮想関数として宣言することができますBasecalcこれは、すべての派生クラスでまったく同じ署名がある場合にのみ機能します。その場合、派生クラスでコードを変更する必要はありません。これで、呼び出すとthis->calcBaseの実装にディスパッチされDerivedます。

class Base
{
  public: 
    vitrual void someMethod();
    void containerCallsThisMethod();

    virtual ~Base(); // Important !!
  protected:
    virtual void calc() = 0;
};
void Base::containerCallsThisMethod()
{
  calc(); // will call derived class implementation
}

Baseこれを行うときは、忘れずに仮想デストラクタを追加してください。

これが機能するのは、メソッドが仮想として宣言されると、明示的に指定されていなくても、すべての派生クラスでも仮想になるためです。

于 2013-08-07T11:17:02.217 に答える