使用范围解析运算符在构造函数中调用虚拟方法是否安全?

问题描述 投票:-1回答:1

我有一个类层次结构,其中每个类都有一个方法compute,它将触发一些(重新)计算。该方法是一个虚方法(在基类中它是纯虚方法)。在某些情况下,我想从构造函数中调用此方法以立即设置实例。

当然,这很危险。 Eclipse CDT Code Analysis发出错误“在构造函数中调用虚拟方法可能导致崩溃和意外行为”。我了解错误消息及其原因。请,请not告诉我为什么应该避免这种情况!!

为了使错误消息和(更重要的)消除错误的可能性,我引入了一个作用域解析运算符。因此,构造函数现在看起来像这样:

MyClass::MyClass()
{
    MyClass::compute();
}

我希望这绝对是安全的。但是Eclipse代码分析继续显示错误消息。为什么?不可能调用意外的方法。如果该方法在MyClass中是纯虚拟的,则编译器会告诉我。

这是Eclipse代码分析错误还是我缺少什么?

编辑:范围解析运算符应该抑制虚拟解析。因此,我希望它可以防止警告中提到的所有可能的错误。我的假设是真的吗?

c++ constructor eclipse-cdt virtual-functions
1个回答
0
投票

我想从评论/聊天中总结出最重要的观点:

  1. 范围解析运算符可以用作一种注释,指示对虚拟分辨率的抑制。它实际上没有作用,因为在构造函数(和析构函数)中,虚拟调用机制始终处于禁用状态。由于潜在的错误(执行另一种方法而不是用户期望的方法)已经消失,因此不应对该代码发出警告。是安全的。
  2. 引入非虚拟“帮助程序”方法是一种替代方法。然后,构造函数和虚拟方法都可以将其任务委托给非虚拟方法。对于那些希望遵守“避免从构造函数或析构函数调用虚拟方法”规则的人来说,这种方法似乎不太可疑。另一方面,它看起来不太优雅,因为它有必要引入样板助手方法。
© www.soinside.com 2019 - 2024. All rights reserved.