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

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

本文关键字:虚拟 调用 方法 是否 安全 构造函数 运算符 使用范围      更新时间:2023-10-16

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

当然,这可能是危险的。Eclipse CDT 代码分析发出错误"在构造函数中调用虚拟方法可能会导致崩溃和意外行为"。我了解错误消息及其原因。请不要告诉我为什么要避免这种情况!!

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

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

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

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

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

我想总结一下评论/聊天中最重要的几点:

  1. 示波器解析运算符可用作一种注释,以指示虚拟分辨率的抑制。它实际上没有任何效果,因为在构造函数(和析构函数(中,虚拟调用机制无论如何都是禁用的。由于错误的可能性(执行用户预期的方法之外的另一种方法(已消失,因此不应为该代码发出警告。这是安全的。
  2. 引入非虚拟"帮助程序"方法是一种替代方法。然后,构造函数和虚拟方法都可以将其任务委托给非虚拟方法。对于那些想要坚持规则"避免从构造函数或析构函数调用虚拟方法"的人来说,这种方法可能看起来不那么可疑。另一方面,它似乎不那么优雅,因为它使得引入样板帮助程序方法变得必要。