1

我对“构造函数不应调用虚拟方法”(在 C++ 中)有疑问。是的,我知道问题所在。问题很清楚。它被描述为例如here

我有一个特别的问题。我从 CppDepent 开始检查我的项目。现在,每次我在构造函数中调用虚函数时,CppDepent 都会警告我。不管函数是否在基类上。如果它是其他类的虚函数,它会发出警告。(见样本)

问题: 在类的构造函数(相同的析构函数)上调用虚函数是否不是基类是一个问题。

class NotABaseClass {
    explicit NotABaseClass(){}

    virtual void foo_virtual(){};
}

class NotADeriveClass {

    explicit NotADeriveClass(){
        NotABaseClass notABaseClass;
        notABaseClass.foo_virtual();
    }
}
4

1 回答 1

1

C++ 规则说,如果完全构造,则不得在该对象之前调用该对象的虚拟方法

在您的示例中,以这种方式调用虚拟方法:

explicit NotADeriveClass(){  // we are in a ctor: *this is not fully constructed
    NotABaseClass notABaseClass;   // let us create a local NotABaseClass object
    notABaseClass.foo_virtual();   // legal on a fully constructed object
}

许多工具试图检测可疑表情的问题,如果它们是由人类而不是神创造的。因此,他们有时可能无法检测到问题(未检测到)或对合法问题发声(误报)。此外,误报通常被视为不那么严重,因为程序员只需检查他们的代码并忽略它。如果您可以确保警告只是误报,您通常可以使用特殊注释向工具发出信号,表明在该特殊位置忽略一条特定规则以消除警告。只要确保尽可能少地忽略...

于 2021-01-24T13:32:43.260 回答