【发布时间】:2011-06-13 18:34:05
【问题描述】:
我想通过继承扩展已声明的访问者,并让运行时环境搜索访问者的后代以找到要执行的正确方法。我可以在 C# 中使用它,但我希望在 C++ 中使用它。我在g ++中尝试了以下代码并且没有调用后代方法;只调用基类的方法。
#include <iostream>
using namespace std;
struct Field; // Forward declaration
struct Visitor
{
virtual void visit(Field& f) = 0; // Visits Field objecs and objects derived from Field.
};
struct Field_String;
struct Visitor_Field_String : public Visitor
{
// Extend the Visitor by specifying a visitation
// for Field_String
virtual void visit(Field_String& fs) = 0;
};
struct Field
{
void accept_visitor(Visitor& v)
{
cout << "Field accepting visitor.\n";
v.visit(*this);
}
};
struct Field_String : public Field
{
void accept_visitor(Visitor& v)
{
cout << "Field_String accepting visitor.\n";
v.visit(*this); // Line 1
}
};
struct Full_Visitor : Visitor_Field_String
{
void visit(Field& f)
{
cout << "Visiting a Field object\n";
return;
}
void visit(Field_String& fs)
{
cout << " Visiting a Field_String object\n";
return;
}
};
int main(void)
{
Field_String fs;
Full_Visitor visitor;
fs.accept_visitor(visitor);
return 0;
}
我得到以下输出:
# g++ --version
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# g++ -o virtual_visitor.exe virtual_visitor.cpp
# ./virtual_visitor.exe
Field_String accepting visitor.
Visiting a Field object
我想要的输出是:
Field_String accepting visitor.
Visiting a Field_String object
我的两个问题:
- 为什么
visit方法在 后代访客没有被处决? - 如何执行
visit方法 在后代访问者中使用 多态性?
注意:目标是减少在访问者类中指定的类,方法是使用继承并允许可能不使用访问者中指定的所有类的情况。
注意:这不是双重分派,而是扩展分派。
【问题讨论】:
-
我认为您不了解访问者模式
标签: c++ inheritance design-patterns visitor-pattern