我想做的是:
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
获取一个传递的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*>
from 代码,其中我在编译时允许使用的所有信息都是D
从B
. 这种情况可能是由于通过list<D>
指向抽象基类的指针传递的,或者其自身位于基类中的代码。
如果仅list<D*>::iterator
源自list<B*>::iterator