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
(我也属于这一类)因为它将在编译时捕获任何情况,即在派生类中方法预期为虚拟的,但在基类中它没有声明为虚拟的
我相信上面是一个例子,但重要的是不要忘记基类中的虚拟析构函数欢迎来到C++!您需要在定义任何类的所有成员之前正确声明它们。甚至是从基类重写的虚拟方法。谢谢Nim!我理解你的回答是:我将无法避免在Visitor的专门声明中声明接口函数?是的,除非你有一个层次结构,其中一些功能在不同的抽象级别上实现。好的,这回答了我的问题。你会用你的评论中的信息来回答这个问题吗?重要的细节是,我正在尝试的是不可能的。谢谢服务!我看到了如何实现函数,从而使它们在派生类中可见。然而,这与问题的方向相反:我希望尽可能地懒惰,因此除了最后一个类之外,我希望将派生类的实现排除在外。