将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
Does it make sense to add final keyword to the virtual function in a class that has no base class (is not derived)
我正在阅读一个很棒的 C++11 教程,作者在解释 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
则子类仍然可以实现该函数并隐藏基类函数。
通过使函数virtual
和final
子类不能覆盖或隐藏函数。
是的!在您提供的示例中,final
关键字可防止任何派生类重写f()
正确说法。如果函数是非虚拟的,则允许D:f()
隐藏函数的基类版本:
struct B {
void f() const; // do not override
virtual void g();
};
struct D : B {
void f() const; // OK!
void g(); // OK
};
通过使f()
成为virtual
和final
函数,任何重写或隐藏的尝试都会导致编译错误。
你的直觉是对的:让一个函数virtual
只是立即用final
封盖它,与非虚函数相比没有任何好处。这只是演示该功能的简短示例片段。
此外,如其他答案中所述,这实际上破坏了函数隐藏 - 您将永远无法在D
或其任何派生类中拥有具有相同参数列表的f
函数。
这是当您决定在模型中限制f
时要完成的权衡。由于无法在此处执行实际的虚拟呼叫,因此您基本上具有缺点,没有任何好处。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 左移负整数为零是否有意义?
- 是否有一个上下文表达式`a.b :: c`有意义
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 将可选与reference_wrapper相结合是否有意义?
- 函数返回rvalue参考是否有意义
- 将 [[noreturn]] 添加到主函数是否有意义
- 在shared_ptr的自定义删除器中检查 nullptr 是否有意义?
- 拥有一个没有构造函数的类是否有意义
- 这是否有意义,我的计算机只能并行运行4个线程
- constexpr移动构造函数是否有意义
- 为赋值编写伪代码,并希望仔细检查它是否有意义
- 在目标平台上编译 Boost 自己是否有意义
- 多层继承在C 中是否有意义
- 从 STL 容器继承并删除"新"运算符以防止由于缺少虚拟析构函数而导致未定义的行为是否有意义?
- 一元运算符关联是否有意义