すべての派生クラスを変更する以外に、問題の解決策を見つけることができません。
から継承するBaseクラスと約1000のクラスがあります。ここで、クラス ポインターのベクトルを含む別のクラス say があります。DerivedBaseContainerBasestd::vector<Base *> derivList
上記のリストには、作成後のすべての派生クラス オブジェクトのアドレスが入力されます。
すべてのファイルは異なる翻訳単位にあります。
私がしたいこと:
1)異なる派生クラスを指しているコンテナー内のベクトルの要素を使用して、Baseクラスからクラスの単一の関数を呼び出すことができるようにします。Container
2)しかし、この関数を呼び出すと、その関数内で、クラス ポインターが指しているpublic members別Derivedのクラスにアクセスできるようになるはずです。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
多くの労力、特定の設計パターン、またはハックなしでこれを行う方法はありますか?