7

我已经看到了几个演示访问者模式的示例。在所有这些方法中,每个派生的访问元素都实现了通常称为 Accept() 方法。

在颜色层次结构中,此方法可能如下所示:

void Red::accept(Visitor *v)
{
    v->visit(*this);
}

void Blue::accept(Visitor *v)
{
    v->visit(*this);
}

当访问者及其继承者具有以下方法时:

visit(Red red);
visit(Blue blue)

我的问题是为什么不在基类中以相同的方式实现它(在这个例子中Color:)并且多态性将完成这项工作,即正确的访问将被调用,因为当对象是时thisRed的动态类型是Red取消引用它会产生一个Red这反过来会导致访问(红色)被调用?

我错过了什么?

4

3 回答 3

8

Inheritance polymorphism (dynamic dispatch) does not apply to function arguments. In other words, overloaded function are selected on the static type of the arguments being passed. If implemented in the base class Color, the v->visit(*this) would always call visit(Color c).

于 2013-06-19T12:25:35.837 回答
1

My understanding is that in base class methods the this pointer is of type base, not of any derived classes, hence it can only access base class methods, and is passed as type Color* this. When passed to the visit method it would try and run visit(Color* color), as polymorphic behavior only applies to methods of the class itself (not other classes).

于 2013-06-19T12:26:02.693 回答
1

如果accept你只有...

void Color::accept(Visitor* v)
{
    v->visit(*this);
}

visit只会被基类调用。为了visit使用正确的派生类进行调用,您需要每个派生类都Color实现它,以便它们可以传递正确类型this的 ,从而visit调用正确的重载。

于 2013-06-19T12:25:20.470 回答