gpt4 book ai didi

c++ - 访客 : adding more types via inheritance

转载 作者:行者123 更新时间:2023-11-30 04:33:54 28 4
gpt4 key购买 nike

我想通过继承扩展已声明的访问者,并让运行时环境搜索访问者的后代以执行正确的方法。我可以在 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

我的两个问题:

  1. 为什么 visit 方法在未执行后代访问者?
  2. 如何执行 visit 方法在后代访问者中使用多态性?

注意:目标是通过使用继承并允许可能不会使用访问者中指定的所有类的情况来减少访问者类中指定的类。

注意:这不是双重调度,而是扩展调度。

最佳答案

你不能在 C++ 中做到这一点(你真的可以在 C# 中做到这一点而无需反射(reflection)吗?)关于特定问题:

  1. 编译器根据引用的静态类型解析要使用的函数重载,并根据对象的动态类型解析该函数​​的最终重写。

  2. 您需要在基类中提供所有不同的重载。如果你做不到,你可以做一些令人讨厌的事情,比如 dynamic_cast 来尝试确定接收到的 Visitor 是否支持那个特定的字段,但我会避免它所有费用。 dispatch *。

既然不同的字段类型没有被多态使用(或者至少它看起来不像,因为 accept_visitor 函数不是虚拟的),你为什么不接受具体的访问者类型?

struct Field_String : Field
{
void accept_visitor(Visitor_Field_String& v)
{
cout << "Field_String accepting visitor.\n";
v.visit(*this);
}
};

关于c++ - 访客 : adding more types via inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334653/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com