c++ - 虚拟决赛作为安全
问题描述
考虑以下:
class foo
{
public:
virtual void bar() final {}
};
为了防止bar
在子类中重新声明,可以使用virtual final
. 这是一个好主意吗?即使启用优化,这是否会以运行时开销为代价?如果已经有一个虚拟表,它的大小会扩展到有bar
吗?
解决方案
我发现了这个问题,因为我有同样的想法——所以我认为这是个好主意。
回答VS 2017的问题(基于阅读反汇编):
- 即使在调试模式下也没有运行时开销。只是一个普通的函数调用。
- 增加了 v-table 的开销(在函数的 vtable 中有一个条目;所以如果你已经有虚函数,那么开销非常小)。
- 正如预期的那样,它将检测有人试图添加
void bar()
派生类的情况。
一个特定的用例是,如果您正在重构并且该功能是虚拟的,并且您想要将其删除或使其成为非虚拟的。
删除部分也可以在相关(不重复)问题的一个答案中找到:最终虚函数有什么意义?
但是,它似乎没有被考虑在:http: //isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rh-override ,因此您可能必须在代码审查中证明它的合理性。
推荐阅读
- python - 无法读取正确的 buildozer logcat
- node.js - 反应,节点:变量在 app.post() 上显示未定义
- javascript - ajax, jquery with mysql query in js - 这可能吗?
- javascript - $.get 返回相同的数组
- node.js - 未使用 REST API 在 Node Js 中调用函数
- regex - 基于排除字符集的Python正则表达式搜索
- python - Discord python 随机调查/测验
- ios - 如何阻止网络视图自动播放视频?
- python - 列表列表中位置 x 的最大值
- c# - 如何将datagridview上的选定数据以单独的形式发送到文本框?