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

时间:2014-03-20 08:42:23

标签: c++ visitor-pattern

我有一个如此定义的类结构:

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;
    }
};

使用这样定义的类结构,如果我写了调用,例如

Dog dog;
ConcreteVisitor v;
dog.accept(v);

它将打印dog。现在我的问题是:如何在打印狗之后在Pet班(基类)上给访客打电话?我需要在ConcreteVisitor类中完成此而不用显式调用它。我这样做是因为访问者的实现(如ConcreteVisitor)对我来说是失控的(谁使用我的代码扩展Visitor以对我的类结构做任何事情)并且他们无法在基类型上调用访问者。 对不起,我的英文不好,谢谢你的建议,谢谢你的答案。

2 个答案:

答案 0 :(得分:1)

来自:http://www.cplusplus.com/doc/tutorial/polymorphism/

Dog dog;
Pet* pet = &dog;

ConcreteVisitor v;
pet->accept(v)

答案 1 :(得分:0)

这样的事情:

Dog dog;
Pet& pet = dog;

ConcreteVisitor cv;
Visitor& v = cv;

pet.accept(v);