在没有基础 class(未派生)的 class 中向虚函数添加 final 关键字是否有意义
Does it make sense to add final keyword to the virtual function in a class that has no base class (is not derived)
我正在读一本很棒的 awesome C++11 tutorial,作者在解释 final
关键字时提供了这个例子:
struct B {
virtual void f() const final; // do not override
virtual void g();
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
void g(); // OK
};
那么在这里使用 final
关键字有意义吗?在我看来,您可以避免在此处使用 virtual
关键字并防止 f()
被覆盖。
您的直觉是正确的:创建函数 virtual
只是为了立即用 final
限制它与非虚函数相比没有任何好处。这只是一个演示该功能的简短示例片段。
此外,如其他答案中所述,这实际上破坏了函数隐藏——您将永远无法在 D
或任何它派生 类.
当您决定在模型中限制 f
时,这是一个权衡。由于无法在此处执行实际的虚拟调用,因此您基本上处于劣势而没有优势。
如果你不将函数标记为virtual
和final
那么child-class仍然可以实现该函数并隐藏base-class函数.
通过使函数 virtual
和 final
子 class 无法覆盖 或 隐藏函数。
是的!在您提供的示例中,final
关键字会阻止任何派生的 classes 覆盖 f()
,正如您所说的那样。如果该函数是非虚函数,则允许 D:f()
隐藏 函数的基本 class 版本:
struct B {
void f() const; // do not override
virtual void g();
};
struct D : B {
void f() const; // OK!
void g(); // OK
};
通过使 f()
成为 virtual
和 final
函数,任何覆盖或隐藏的尝试都会导致编译错误。
我正在读一本很棒的 awesome C++11 tutorial,作者在解释 final
关键字时提供了这个例子:
struct B {
virtual void f() const final; // do not override
virtual void g();
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
void g(); // OK
};
那么在这里使用 final
关键字有意义吗?在我看来,您可以避免在此处使用 virtual
关键字并防止 f()
被覆盖。
您的直觉是正确的:创建函数 virtual
只是为了立即用 final
限制它与非虚函数相比没有任何好处。这只是一个演示该功能的简短示例片段。
此外,如其他答案中所述,这实际上破坏了函数隐藏——您将永远无法在 D
或任何它派生 类.
当您决定在模型中限制 f
时,这是一个权衡。由于无法在此处执行实际的虚拟调用,因此您基本上处于劣势而没有优势。
如果你不将函数标记为virtual
和final
那么child-class仍然可以实现该函数并隐藏base-class函数.
通过使函数 virtual
和 final
子 class 无法覆盖 或 隐藏函数。
是的!在您提供的示例中,final
关键字会阻止任何派生的 classes 覆盖 f()
,正如您所说的那样。如果该函数是非虚函数,则允许 D:f()
隐藏 函数的基本 class 版本:
struct B {
void f() const; // do not override
virtual void g();
};
struct D : B {
void f() const; // OK!
void g(); // OK
};
通过使 f()
成为 virtual
和 final
函数,任何覆盖或隐藏的尝试都会导致编译错误。