C 结构实现派生接口

C++ struct implement derived interface

本文关键字:接口 派生 实现 结构      更新时间:2023-10-16

在实验C 中的访问者模式时,我就实现派生接口遇到了一个愚蠢的问题。我怀疑我不知道如何正确提出问题,因为我还没有找到其他地方的解决方案。

我有以下基础结构:

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

我希望声明几个访客的具体实现以及一些额外的功能。这就是我希望我的声明看起来像

struct EndVisitor : public Visitor{
    virtual bool hasEnded();
};
struct SetupVisitor : public Visitor{
};
struct ScoreVisitor : public Visitor{
    virtual unsigned int getScore();
};

定义时,例如得分为Visitor,IDE和编译器识别ScoreVisitor中的额外功能声明:

unsigned int ScoreVisitor::getScore() {
    return total;
}

但是,编译器或IDE(Funtion 'visit' not declared in class 'ScoreVisitor'(未识别实施访问者功能:

void ScoreVisitor::visit(const Resources resources) {
    total += resources.score;
}
void ScoreVisitor::visit(const Population population) {
    total += population.score;
}

如果我声明了重复访问者函数的ScoreVisitor,则代码会编译,但是在所有访问者的专用声明中,我都希望避免使用大量复制的代码。这不是我希望我的声明看起来像

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

如何声明访客的专业版本,而不必复制访客已经声明的所有功能?

无法避免必须声明您从派生类中的基类覆盖的方法。这就是语言的方式。通常,人们将功能分组为某种形式的继承层次结构以暴露共同的功能。

注意几个与语法相关的事项,virtual对于派生类是可选的(默认情况下,具有相似签名的函数是虚拟的(,因为C 11,有些人已经使用override(我也属于此类别(由于在编译时会捕获 - 在派生类A方法中的任何情况下都会虚拟,但在基类中,它并未被声明为此。

我敢肯定以上是一个例子,但是至关重要的是,您不要忘记基类中的虚拟驱动器!

它不是理想的,但是您可以使用从访客继承并从中获得其他类的子类来进行:

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);