从抽象 class 继承以创建另一个抽象 class 时,我应该重新声明所有虚函数吗?

When inheriting from an abstract class to create another abstract class should I redeclare all virtual functions?

在使用 C++ 时,这更像是一个首选的风格问题。我正在寻找与此相关的首选标准。

假设我有一个接口 A

class AInterface {
public:
    virtual ~AInterface() = default;
    virtual void a() = 0;
};

然后我有另一个建立在 A 之上的接口 B

class BInterface : public AInterface{
public:
    virtual void b() = 0;
    virtual void otherb() = 0;
};

我的问题是我是否应该像这样在 B 中重新声明来自 AInterface 的所有虚函数?

class BInterface : public AInterface{
public:
    virtual void a() = 0;
    virtual void b() = 0;
    virtual void otherb() = 0;
};

没有。你不必。

...你不应该,因为这是没有好处的不必要的重复。如果这样做,至少使用 override 关键字来避免声明中的不匹配。

假设您将基数更改为

class AInterface {
public:
    virtual ~AInterface() = default;
    virtual void a(int) = 0;
};

并且您忘记更新 BInterface,然后哎呀,现在您在 BInterface 中有一个不想要的 void a()。但是,如果您有 override:

class BInterface : public AInterface{
public:
    virtual void a() override = 0;
    virtual void b() = 0;
    virtual void otherb() = 0;
};

你会得到一个编译器错误,因为在上面的重构之后 void a() 没有从它的基类中覆盖一个方法。

如果您打算更改基础 class 的功能,则您只需重新 declare/define 后续 class 中的虚函数。也就是说,您给出的示例都是纯虚拟 classes,因此您将无法实例化它们。但总的来说,继承的要点之一是您不必不断地重新声明为派生的 classes.

做同样事情的函数