C++ 虚拟访客
我有一个类的层次结构(C++ 虚拟访客,c++,visitor,C++,Visitor,我有一个类的层次结构(Base和daugthersa,B,C等等)。层次结构树不是有限的。可以使用众所周知的访问者模式访问Base*,以便动态地适应Base*的动态类型。访问者有一个类型,如BaseVisitor。像这样: struct BaseVisitor; struct Base { virtual void accept(BaseVisitor &v) = 0; }; struct A : Base { int a; A(int x) : a(x) {} ~
Base
和daugthersa
,B
,C
等等)。层次结构树不是有限的。可以使用众所周知的访问者模式访问Base*
,以便动态地适应Base*
的动态类型。访问者有一个类型,如BaseVisitor
。像这样:
struct BaseVisitor;
struct Base {
virtual void accept(BaseVisitor &v) = 0;
};
struct A : Base {
int a;
A(int x) : a(x) {}
~A(void) = default;
void accept(BaseVisitor &v) override {
v->visit(*this);
}
};
struct B : Base {
float b;
B(void) : b(314.f) {}
~B(void) = default;
void accept(BaseVisitor &v) override {
v->visit(*this);
}
};
struct BaseVisitor {
void visit(Base &) {}
void visit(A &a) {
std::cout << "just visited a A; a=" << a.a << std::endl;
}
void visit(B &b) {
std::cout << "just visited a B; b=" << b.b << std::endl;
}
};
你有什么想法吗?为什么不把
BaseVisitor
抽象化为visit(A&)=0
和visit(B&)=0
?问题是层次结构树不是有限的(更新帖子),你的意思是继承的深度吗?它怎么不是有限的呢?因为我不知道所有继承的类,所以我不能将它们放在visitor中。为了让这有意义,您需要visitor(派生类或基类)对所有类都一视同仁。如果它需要“知道”该类是a
还是B
类,那么使用虚拟访问者将不起作用。
struct ABaseVisitor {
virtual void visit(Base &) = 0; /* huh? */
};