すべての派生クラスを変更する以外に、問題の解決策を見つけることができません。
から継承するBase
クラスと約1000のクラスがあります。ここで、クラス ポインターのベクトルを含む別のクラス say があります。Derived
Base
Container
Base
std::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
クラスを変更することはできます。 Base
Derived
クラスのリスト (前方宣言でさえも) を持つことはできません。
関数の型があり、派生クラスのオブジェクトを指しているので、this
ポインターを介して実行できると思いました。しかし、を使用してクラス メソッドを呼び出すことができません。ClassName
non-const
Derived
this
多くの労力、特定の設計パターン、またはハックなしでこれを行う方法はありますか?