好的:这是我的问题:我有一个基础合成类,它接受一个访问者,然后迭代它的节点。奇迹般有效。但是,我必须使用从这个合成派生的,并认识到我必须重写派生类中的“accept()”方法才能进行正确的双重调度(我不明白)。
这带来了两个缺陷:第一,我必须打破基础的隐藏结构,第二,我必须重复代码。为了清楚起见,这是我的伪代码:
struct Visitor
{
void visit( BaseComposit*) { throw( "not expected"); };
void visit( DerivedComposit*) { throw( "ok"); };
};
class BaseComposit
{
private:
std::vector< BaseComposit*> nodes;
public:
virtual void accept( Visitor* v)
{
v->visit( this);
for( int i = 0; i < nodes.size(); i++)
nodes[ i]->accept( v);
}
};
class DerivedComposit : public BaseComposit
{
public:
};
有什么优雅的解决方案吗?谢谢 !
编辑:将“virtual”添加到“accept()”以使其更精确......