我们说我有以下基类:
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()
是完全详细的。
哪一种方法更合适?
答案 0 :(得分:1)
在"方法1"中,虚拟确实是多余的。 '倍率'是一个特殊的标识符,向读者显示虚拟函数被覆盖的代码,同时也是编译器验证实际的提示。基类已经声明该函数是虚函数,因此无需再次执行此操作。
不使用' final'关键字,优良作法是拥有虚拟',只是为了保持可读性。方法2是这种情况下的最佳实践符号。
这种情况归结为你的环境中使用的风格,但最终肯定并不意味着覆盖最终版。
答案 1 :(得分:1)
class Derived : public Base {
public:
void f() override final {};
};
也许那样?派生类中不需要virtual
关键字,override
和final
如果没有方法可以覆盖,则会给您编译错误,但您或其他人可能想删除{{1} }}}}关键字在将来final
为您提供方法行为的纯粹意图。