C++;结构实现派生接口 在C++中对访问者模式进行实验时,我遇到了一个关于派生接口的愚蠢问题。我怀疑我不知道如何正确地表述这个问题,因为我在其他地方没有找到解决这个问题的办法

C++;结构实现派生接口 在C++中对访问者模式进行实验时,我遇到了一个关于派生接口的愚蠢问题。我怀疑我不知道如何正确地表述这个问题,因为我在其他地方没有找到解决这个问题的办法,c++,struct,visitor-pattern,C++,Struct,Visitor Pattern,我有以下基本结构: struct Visitor { virtual void visit(const Resources) = 0; virtual void visit(const Population) = 0; }; 我想声明几个Visitor的具体实现以及一些额外的功能我希望我的声明是这样的: struct EndVisitor : public Visitor{ virtual bool hasEnded(); }; struct SetupVisitor

我有以下基本结构:

struct Visitor {
    virtual void visit(const Resources) = 0;
    virtual void visit(const Population) = 0;
};
我想声明几个Visitor的具体实现以及一些额外的功能我希望我的声明是这样的

struct EndVisitor : public Visitor{
    virtual bool hasEnded();
};

struct SetupVisitor : public Visitor{
};

struct ScoreVisitor : public Visitor{
    virtual unsigned int getScore();
};
struct ScoreVisitor : public Visitor{
    virtual void visit(const Resources);
    virtual void visit(const Population);
    virtual unsigned int getScore();
};
例如,在定义ScoreVisitor实例时,IDE和编译器会识别ScoreVisitor中的额外函数声明:

unsigned int ScoreVisitor::getScore() {
    return total;
}
但是,编译器或IDE无法识别访问者函数的实现(
function'visit'未在类'ScoreVisitor'中声明)
):

如果我声明ScoreVisitor并重复Visitor函数,代码就会编译,但是这会在Visitor的所有专门声明中留下大量复制粘贴的代码,这是我希望避免的我不希望我的声明是这样的

struct EndVisitor : public Visitor{
    virtual bool hasEnded();
};

struct SetupVisitor : public Visitor{
};

struct ScoreVisitor : public Visitor{
    virtual unsigned int getScore();
};
struct ScoreVisitor : public Visitor{
    virtual void visit(const Resources);
    virtual void visit(const Population);
    virtual unsigned int getScore();
};

如何声明Visitor的专用版本,而不必复制粘贴Visitor已声明的所有功能?

这并不理想,但您可以使用继承自Visitor的子类,并让其他类从中派生:

struct Visitor {
    virtual void visit(const int) = 0;
};

struct VisitorImplementor : public Visitor
{
    virtual void visit(const int) override { /* implement */}
};


struct EndVisitor : public VisitorImplementor {
    virtual bool hasEnded() { return true; }
};
现在您可以创建EndVisitor的实例并调用它

EndVisitor v;

v.visit(10);

无法避免必须声明从派生类中的基类重写的方法。这就是语言的方式。通常,人们将功能分组到某种形式的继承层次结构中,以公开公共功能

注意一些与语法相关的问题,
virtual
对于派生类是可选的(具有类似签名的函数默认为virtual),自C++11以来,一些人已经开始使用
override
(我也属于这一类)因为它将在编译时捕获任何情况,即在派生类中方法预期为虚拟的,但在基类中它没有声明为虚拟的


我相信上面是一个例子,但重要的是不要忘记基类中的虚拟析构函数