私がやりたいことはこれです:
class Ba { }
class Da : public Ba {}
class Db : public Ba {}
class Bb // abstract base class that must not be a template.
{
void Process()
{
list<Ba*>::iterator pos;
// I known the derived class will also derive
// from list<Dx*> where Dx derives from Ba
for(pos = this->begin(); pos < this->end(); pos++)
something(*pos);
}
}
template<T> class L : public Bb , list<T*> // T is always derived from Ba
{
}
しかし、それは無効です。それで、次善の策は何ですか?
別の定式化では、型が実行時までわからないグローバルProcess
get に渡されたポインターがあります。Bb
void GlobalProcess(Bb* bb) // don't know what kind of Bb (which L) got passed in.
{
list<Ba*>::iterator pos;
// I known the derived class will also derive
// from list<Dx*> where Dx derives from Ba
for(pos = bb->begin(); pos < bb->end(); pos++)
something(*pos);
}
これを行う理由はいくつかありますが、その約半分は C++ システムの限界を感じているためです。
私が思い付くことができる問題の最も単純な形式は、list<D*>
コンパイル時に使用できるすべての情報がD
from から派生したものである from コードを反復処理する必要があることですB
。この状況はlist<D>
、ポインターを介して抽象基本クラスに渡された場合、またはコード自体が基本クラスにある場合に発生する可能性があります。
list<D*>::iterator
のみから派生した場合、これはすべて正常に機能しますlist<B*>::iterator