c++中访问者模式的层次结构实现
Hierarchy implementation of the visitor pattern in C++
我有一个这样定义的类结构:
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);
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 如何在层次结构中实现运算符使用?
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 我是否需要遍历升压 rtree 的层次结构才能实现最大效率?
- 在C++中实现 Java 集合层次结构
- 如何在 C++1x 中为类层次结构实现完全通用的访问者?
- 我可以部分实现接口层次结构吗
- 正确实现类层次结构
- C++ 具有多父多态层次结构的 VTable 实现
- 继承层次结构中接口与实现的分离(C++新手)
- 类的层次结构,试图在基本级别实现函数
- 如何实现具有注入功能的结构的一般层次结构
- 用C++实现两个类层次结构的双重调度
- 在 C++11 中,如何实现适合内置类型层次结构的算术类型
- c++中访问者模式的层次结构实现