首页 > 解决方案 > 虚拟决赛作为安全

问题描述

考虑以下:

class foo
{
public:
    virtual void bar() final {}
};

为了防止bar在子类中重新声明,可以使用virtual final. 这是一个好主意吗?即使启用优化,这是否会以运行时开销为代价?如果已经有一个虚拟表,它的大小会扩展到有bar吗?

标签: c++visual-c++

解决方案


我发现了这个问题,因为我有同样的想法——所以我认为这是个好主意。

回答VS 2017的问题(基于阅读反汇编):

  • 即使在调试模式下也没有运行时开销。只是一个普通的函数调用。
  • 增加了 v-table 的开销(在函数的 vtable 中有一个条目;所以如果你已经有虚函数,那么开销非常小)。
  • 正如预期的那样,它将检测有人试图添加void bar()派生类的情况。

一个特定的用例是,如果您正在重构并且该功能是虚拟的,并且您想要将其删除或使其成为非虚拟的。

删除部分也可以在相关(不重复)问题的一个答案中找到:最终虚函数有什么意义?

但是,它似乎没有被考虑在:http: //isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rh-override ,因此您可能必须在代码审查中证明它的合理性。


推荐阅读