访客:通过继承添加更多类型
|
我想通过继承扩展一个声明的Visitor,并让运行时环境在Visitor的后代中搜索要执行的正确方法。我可以在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
我的两个问题:
为什么“ 3”法在
后代访客未执行?
如何执行visit
方法
在后代访客中使用
多态性?
注意:目的是通过使用继承并允许可能不使用Visitor中指定的所有类的情况来减少Visitor类中指定的类。
注意:这不是双重调度,而是扩展调度。
没有找到相关结果
已邀请:
2 个回复
期差骇蓟
函数不是虚拟的),为什么不接受具体的访问者类型?
膝垫富顷
虚拟类派生第二个
虚拟类类型?例如,如果您这样定义基类
和
:
您将获得所需的功能。您尝试执行的操作的问题在于,将
多态转换为的类类型是仅定义了
的
对象类型。因此,在类型
的类上调用
,而在
函数内部没有某种类型的附加转换为ѭ9cast类类型时,将不会引用
函数的其他重载版本,因为它们是在派生类中定义的。