c++ - 使用范围解析运算符时在构造函数中调用虚方法是否安全?
问题描述
我有一个类层次结构,其中每个类都有一个compute
会触发一些(重新)计算的方法。这个方法是一个虚拟方法(它在基类中是纯虚拟的)。在某些情况下,我想从构造函数中调用此方法来立即设置我的实例。
当然,这可能很危险。Eclipse CDT 代码分析发出错误“在构造函数中调用虚拟方法可能导致崩溃和意外行为”。我了解错误信息及其原因。请,请不要告诉我为什么要避免这种情况!!!
为了使错误消息和(更重要的)错误的可能性消失,我引入了一个范围解析运算符。所以构造函数现在看起来像这样:
MyClass::MyClass()
{
MyClass::compute();
}
我希望那是绝对安全的。但是 Eclipse 代码分析继续显示错误消息。为什么?不可能调用意外的方法。如果该方法是纯虚拟 in MyClass
,编译器会告诉我。
这是 Eclipse 代码分析错误还是我遗漏了什么?
编辑:范围解析运算符应该抑制虚拟解析。因此,我希望它可以防止警告中提到的所有可能的错误。我的假设是真的吗?
解决方案
我想总结评论/聊天中最重要的几点:
- 范围解析运算符可以用作一种注释来指示虚拟解析的抑制。它实际上没有任何效果,因为在构造函数(和析构函数)中,虚拟调用机制无论如何都被禁用了。由于错误的可能性(执行用户期望的方法之外的另一种方法)已经消失,因此不应为该代码发出警告。这是安全的。
- 引入非虚拟“助手”方法是一种替代方法。然后,构造函数和虚方法都可以将它们的任务委托给非虚方法。对于那些想要坚持“避免从构造函数或析构函数调用虚方法”规则的人来说,这种方法可能看起来不那么可疑。另一方面,它似乎不太优雅,因为它使得引入样板辅助方法成为必要。
推荐阅读
- excel - 将选定单元格的特定区域选择为 PDF,然后在工作表中使用 VBA 进行打印
- flutter - Flutter 中的 delta、globalPosition、localPosition 和 primaryDelta 是什么?
- python - 如何在 Python 中保存对文件的响应?
- javascript - 将平面列表渲染“项目”传递给函数。React Native(有点 js 问题)
- javascript - 存储/重用 Ajax 响应的最佳实践
- azure-devops - 在 Microsoft 机器学习服务器上使用 Azure Devops python 工件存储库
- docker - 为什么我无法通过 tomcat 服务器访问我在 Kubernetes 集群中的应用程序?
- python - BOTO3:打印特定区域的实例信息
- python - 在 python 中打印到 .txt 文件时,有没有办法保留多行?
- mysql - Laravel 雄辩 - 使用 groupBy 并在同一个查询中