C++ 访客模式 : Why should every derived visited implement Accept()?

标签 c++ visitor-pattern

我看过几个演示访问者模式的示例。 在所有这些元素中,每个派生的访问元素都实现通常称为 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/

相关文章:

c++ - 我可以将 CRTP 与虚函数或仿函数一起用于访问者算法以容忍类的更改吗

c++ - 使用 TBB 在 vector 中运行函数会给出不正确的输出

c++ - 寻求更好地理解 std::visit

boost - 在 discover_vertex 访问者中改变图的权重

c# - 多态性(未)破坏 C# 中的访问者模式(以及 new 而不是覆盖)

c++ - 适用于集合的 std::async 变体

C++ : create a tuple with vector of strings

具有静态方法的类的 C++ 模板

c++ - boost 日志 : File Rotation

c++ - 在 C++ 中优雅地比较多态树