虚拟决赛作为安全

Virtual Final As Safety

本文关键字:安全 虚拟      更新时间:2023-10-16

考虑以下内容:

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

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

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

回答VS 2017的问题(基于阅读拆解(:

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

一个特定的用例是,如果您正在重构,并且函数是虚拟的,并且您希望删除它或使它成为非虚拟的。

删除部分也出现在相关(非重复(问题的一个答案中:What';最后一个虚拟函数的意义是什么?

然而,它似乎没有被考虑在:http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rh-超控因此,您可能需要在代码审查中证明它的合理性。