当使用了'override'或'final'修饰符时,'virtual'关键字是否是多余的?

4
假设我有以下基类:

class MyBaseClass:

class Base {
    public:
        virtual void f() {};
};

如果我想写一个类来覆盖 f() 并且不允许派生类对其进行覆盖,可以使用以下方法: 方法1:
class Derived : public Base {
    public:
        virtual void f() override final {};
};

方法二:

class Derived : public Base {
    public:
        void f() final {};
};

方法一是完全详细的,而方法二更加简洁,final仍然表明f()实际上是虚函数并且覆盖了基类方法。

哪种方法更恰当呢?


使用virtual、override或两者都使用? - Bruce Adams
这回答了你的问题吗?我应该使用virtual、override还是两者都用? - Bruce Adams
3个回答

2
在"方法1"中,虚拟类确实是多余的。'override'是一个特殊的标识符,向代码读者展示虚函数被覆盖了,并提示编译器验证它是否真的被覆盖了。基类已经声明该函数是虚函数,所以不需要再次声明。
当不使用'final'关键字时,有一个'virtual'是很好的做法,仅仅是为了保持可读性。在这种情况下,方法2是最佳实践符号。
这有点取决于你的环境使用的风格,但'final'绝对不意味着覆盖最后的。

2
class Derived : public Base {
public:
    void f() override final {};
};

也许这样?在派生类中不需要使用virtual关键字,overridefinal都会在没有要重写的方法时给出编译器错误,但您或其他人可能希望在将来删除final关键字,然后override会给出您方法行为的纯粹意图。

0

现在这已经非常过时了,因为C++11已经被广泛使用,但作为C++11的早期采用者,我使用#define重写和最终(override和final)将我的代码回溯到C++03及更早版本。

我怀疑现代平台上不再需要这样做,但你永远不知道。

我仍然觉得美观上的不协调,不能让override和virtual关键字同时出现在同一侧。

这个问题答案 比当前的参考资料更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接