c++中访问者模式的层次结构实现

Hierarchy implementation of the visitor pattern in C++

本文关键字:层次结构 实现 模式 访问者 c++      更新时间:2023-10-16

我有一个这样定义的类结构:

class Pet {};
class Dog : Pet {};
class Cat : Pet {};

在这个类结构上,我实现了访问者设计模式,就像这样:

class Pet {
    virtual void Accept(Visitor& v) {
        v.visit(this);
    }
};
class Dog : Pet {
    virtual void Accept(Visitor& v) {
        v.visit(this);
    }
};
class Cat : Pet {
    virtual void Accept(Visitor& v) {
        v.visit(this);
    }
};
class Visitor {
    virtual void visit(Pet*)=0;
    virtual void visit(Dog*)=0;
    virtual void visit(Cat*)=0;
};
class ConcreteVisitor : Visitor {
    virtual void visit(Pet*) {
        std::cout<<"Pet"<<std::endl;
    }
    virtual void visit(Dog*) {
        std::cout<<"Dog"<<std::endl;
    }
    virtual void visit(Cat*) {
        std::cout<<"Cat"<<std::endl;
    }
};
对于这样定义的类结构,如果我写call,例如
Dog dog;
ConcreteVisitor v;
dog.accept(v);

将打印dog。现在我的问题是:在打印狗之后,我如何在Pet类(基类)上调用访问者?我需要完成这个,而不需要在ConcreteVisitor类中显式调用。我这样做是因为访问者(如ConcreteVisitor)的实现对我来说是失控的(谁使用我的代码扩展Visitor与我的类结构做任何事情),他们不能在基本类型上调用访问者。请原谅我的英语不好,谢谢你的建议。

From: http://www.cplusplus.com/doc/tutorial/polymorphism/

Dog dog;
Pet* pet = &dog;
ConcreteVisitor v;
pet->accept(v)

像这样:

Dog dog;
Pet& pet = dog;
ConcreteVisitor cv;
Visitor& v = cv;
pet.accept(v);