使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
Is it safe to call a virtual method in the constructor when using a scope resolution operator?
我有一个类层次结构,其中每个类都有一个方法compute
,它将触发一些(重新(计算。此方法是一个虚拟方法(它在基类中是纯虚拟的(。在某些情况下,我想从构造函数调用此方法以立即设置我的实例。
当然,这可能是危险的。Eclipse CDT 代码分析发出错误"在构造函数中调用虚拟方法可能会导致崩溃和意外行为"。我了解错误消息及其原因。请不要告诉我为什么要避免这种情况!!
为了使错误消息和(更重要的是(错误的可能性消失,我引入了一个范围解析运算符。所以构造函数现在看起来像这样:
MyClass::MyClass()
{
MyClass::compute();
}
我希望这是绝对安全的。但 Eclipse 代码分析继续显示错误消息。为什么?无法调用意外的方法。如果该方法在MyClass
中是纯虚拟的,编译器会告诉我。
这是一个 Eclipse 代码分析错误还是我遗漏了什么?
编辑:范围解析运算符应该抑制虚拟分辨率。因此,我希望它能防止警告提到的所有可能的错误。我的假设是真的吗?
我想总结一下评论/聊天中最重要的几点:
- 示波器解析运算符可用作一种注释,以指示虚拟分辨率的抑制。它实际上没有任何效果,因为在构造函数(和析构函数(中,虚拟调用机制无论如何都是禁用的。由于错误的可能性(执行用户预期的方法之外的另一种方法(已消失,因此不应为该代码发出警告。这是安全的。
- 引入非虚拟"帮助程序"方法是一种替代方法。然后,构造函数和虚拟方法都可以将其任务委托给非虚拟方法。对于那些想要坚持规则"避免从构造函数或析构函数调用虚拟方法"的人来说,这种方法可能看起来不那么可疑。另一方面,它似乎不那么优雅,因为它使得引入样板帮助程序方法变得必要。
相关文章:
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++ DLL 类导出、编译器"optimizes"虚拟调用
- 类型擦除的std::function与虚拟函数调用的开销
- 虚拟继承中来自基数的虚拟调用
- 通过在基类中虚拟调用派生类中的函数来访问派生类中的函数
- C++虚拟函数是正常调用还是虚拟调用
- 为什么C++虚拟调用并不比非虚拟调用慢多少
- 避免虚拟调用循环的模式
- C++11 标准::功能比虚拟调用慢
- 构造函数中的虚拟调用
- 为什么C++虚拟调用的成本取决于派生类的数量
- 为什么从构造函数对纯虚函数的虚拟调用是 UB,而标准允许调用非纯虚函数
- 优化后的虚拟调用成本
- 对于C++基类来说,存储"this"的值以供构造后的未来虚拟调用安全吗?
- 构造/销毁期间的虚拟调用
- 用FlasCC编译的c++程序使用-O4 (LTO)挂起虚拟调用
- 基构造函数中的 C++/CX 委托失败,并出现纯虚拟调用断言
- 如何将虚拟调用从未模板化的父级干净地分派到模板化的子级
- std::绑定和对基类方法的非虚拟调用