我有一个如此定义的类结构:
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
以对我的类结构做任何事情)并且他们无法在基类型上调用访问者。
对不起,我的英文不好,谢谢你的建议,谢谢你的答案。
答案 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);