访客:通过继承添加更多类型

| 我想通过继承扩展一个声明的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类中指定的类。 注意:这不是双重调度,而是扩展调度。     
已邀请:
        您不能在C ++中做到这一点(您真的可以在C#中做到无反思吗?)关于以下特定问题: 编译器根据引用的静态类型解析要使用的函数重载,并根据对象的动态类型解析该函数​​的最终重写器。 您需要在基类中提供所有不同的重载。如果做不到,您可以做一些令人讨厌的事情,例如ѭ5,尝试确定收到的ѭ6是否支持该特定领域,但我会不惜一切代价避免这样做。 调度*。 由于没有多态地使用不同的字段类型(或者至少看起来像这样,因为
accept_visitor
函数不是虚拟的),为什么不接受具体的访问者类型?
struct Field_String : Field
{
    void accept_visitor(Visitor_Field_String& v)
    {
        cout << \"Field_String accepting visitor.\\n\";
        v.visit(*this);
    }
};
    
        您是否有理由要从
Visitor
虚拟类派生第二个
Visitor_Field_String
虚拟类类型?例如,如果您这样定义基类
Visitor
Full_Visitor
struct Visitor
{
    virtual void visit(Field& f) = 0;
    virtual void visit(Field_String& fs) = 0;
};

struct Full_Visitor : public Visitor
{
    void visit(Field& f)
    {
        cout << \"Visiting a Field object\\n\";
        return;
    }
    void visit(Field_String& fs)
    {
        cout << \" Visiting a Field_String object\\n\";
        return;
    }
};
您将获得所需的功能。您尝试执行的操作的问题在于,将
fs.accept_visitor(visitor)
多态转换为的类类型是仅定义了
virtual void visit(Field& f)
Visitor
对象类型。因此,在类型
Visitor
的类上调用
visit()
,而在
accept_visitor()
函数内部没有某种类型的附加转换为ѭ9cast类类型时,将不会引用
visit()
函数的其他重载版本,因为它们是在派生类中定义的。     

要回复问题请先登录注册