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

Is it safe to call a virtual method in the constructor when using a scope resolution operator?

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

当然这可能很危险。 Eclipse CDT 代码分析发出错误 "Calling a virtual method in constructor can cause crashes and unexpected behavior"。我了解错误信息及其原因。请不要告诉我为什么要避免这种情况!!!

为了使错误消息和(更重要的)错误消失的可能性,我引入了范围解析运算符。所以构造函数现在看起来像这样:

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

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

这是 Eclipse 代码分析错误还是我遗漏了什么?

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

我想总结一下 comments/chat 中最重要的几点:

  1. 范围解析运算符可以用作一种注释来指示虚拟解析的抑制。它实际上没有任何效果,因为在构造函数(和析构函数)中,虚拟调用机制无论如何都是禁用的。由于错误的可能性(执行另一种方法而不是用户预期的方法)已经消失,因此不应为该代码发出警告。很安全。
  2. 引入非虚拟 "helper" 方法是一种替代方法。然后,构造函数和虚方法都可以将它们的任务委托给非虚方法。对于那些想要遵守规则的人来说,这种方法可能看起来不那么可疑 "Avoid calling virtual methods from constructors or destructors." 另一方面,它似乎不太优雅,因为它需要引入样板辅助方法。