不是虚拟的'当'覆盖'或者' final'使用说明符?

时间:2017-04-18 08:06:54

标签: c++ override virtual final

我们说我有以下基类:

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

如果我想编写一个覆盖f()并且不允许覆盖它的类,那么派生类可以使用以下方法编写它:

方法1:

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

方法2:

class Derived : public Base {
    public:
        void f() final {};
};
Approach 1更紧凑且Approach 2仍然表示final实际上是虚拟的并覆盖基类方法时,

f()是完全详细的。

哪一种方法更合适?

2 个答案:

答案 0 :(得分:1)

在"方法1"中,虚拟确实是多余的。 '倍率'是一个特殊的标识符,向读者显示虚拟函数被覆盖的代码,同时也是编译器验证实际的提示。基类已经声明该函数是虚函数,因此无需再次执行此操作。

不使用' final'关键字,优良作法是拥有虚拟',只是为了保持可读性。方法2是这种情况下的最佳实践符号。

这种情况归结为你的环境中使用的风格,但最终肯定并不意味着覆盖最终版。

答案 1 :(得分:1)

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

也许那样?派生类中不需要virtual关键字,overridefinal如果没有方法可以覆盖,则会给您编译错误,但您或其他人可能想删除{{1} }}}}关键字在将来final为您提供方法行为的纯粹意图。