当前位置: 首页 > 知识库问答 >
问题:

c访问者模式:为什么每个被访问的派生实现都应该接受()?

公良育
2023-03-14

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

在颜色层次结构中,此方法可能看起来像:

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

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

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

visit(Red red);
visit(Blue blue)

我的问题是,为什么不以同样的方式只在基类中实现它(在本例中:Color),多态性将完成这项工作,也就是说,将调用正确的访问,因为当对象是Red时,this的动态类型是Red,所以取消引用它将产生Red,这反过来将导致调用访问(Red)?

我错过了什么?

共有3个答案

濮阳和泰
2023-03-14

我的理解是,在基类方法中,这个指针属于base类型,而不是任何派生类,因此它只能访问基类方法,并作为typeColor*this传递。当传递给visit方法时,它会尝试运行visit(Color*Color),因为多态行为只适用于类本身的方法(而不是其他类)。

华知
2023-03-14

如果你唯一的接受是...

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

visit只会被基类调用。为了使用正确的派生类调用visit,您需要每个颜色来实现它,这样他们就可以传递正确键入的this,因此调用正确的visit重载。

王航
2023-03-14

继承多态性(动态分派)不适用于函数参数。换句话说,重载函数是根据所传递参数的静态类型选择的。如果在基类Color中实现,则v-

 类似资料:
  • 模式定义 表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。 class Visitor; class Element { public: virtual void accept(Visitor& visitor) = 0; //第一次多态辨析 virtual ~Element() {} }; class Eleme

  • 问题 你要处理由大量不同类型的对象组成的复杂数据结构,每一个对象都需要进行不同的处理。 比如,遍历一个树形结构,然后根据每个节点的相应状态执行不同的操作。 解决方案 这里遇到的问题在编程领域中是很普遍的,有时候会构建一个由大量不同对象组成的数据结构。 假设你要写一个表示数学表达式的程序,那么你可能需要定义如下的类: class Node: pass class UnaryOperator

  • 主要内容:介绍,实现,ComputerPart.java,Keyboard.java,Monitor.java,Mouse.java,Computer.java,ComputerPartVisitor.java,ComputerPartDisplayVisitor.java,VisitorPatternDemo.java在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行

  • 简介 访问者模式是一种将算法与对象结构分离的软件设计模式。 这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行