我看过几个演示访问者模式的示例。 在所有这些元素中,每个派生的访问元素都实现通常称为 Accept() 方法的方法。
在颜色层次结构中,此方法可能如下所示:
void Red::accept(Visitor *v)
{
v->visit(*this);
}
void Blue::accept(Visitor *v)
{
v->visit(*this);
}
当 Visitor 及其继承者具有以下方法时:
visit(Red red);
visit(Blue blue)
我的问题是为什么不只在基类中以相同的方式实现它(在这个例子中:Color
)多态性将完成这项工作,即正确的访问将被调用,因为什么时候对象是 Red
this 的动态类型是 Red
所以取消引用它会产生 Red
而这又会导致 visit(red)被调用?
我错过了什么?
最佳答案
继承多态性(动态分配)不适用于函数参数。换句话说,根据传递的参数的静态类型选择重载函数。如果在基类 Color
中实现,v->visit(*this)
将始终调用 visit(Color c)
。
关于C++ 访客模式 : Why should every derived visited implement Accept()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17190873/