禁用visualc++虚函数覆盖某些方法的警告

Disabling visual C++ virtual function override warning for certain methods

本文关键字:方法 警告 覆盖 visualc++ 函数 禁用      更新时间:2023-10-16

我想在我们的代码库上启用C4263 (Visual c++)警告,但是,该警告给出了一些误报。我们想要禁用警告,这样只有误报才会消失。我试图用一些通用代码来简化这个问题:

class B {
public:
    virtual void funcA();
    virtual void funcB();
};

class D : public B
{
    virtual void funcA(int);    
    virtual void funcB(int);
};

使用这段代码,我们得到以下警告:void D::funcA(int)':成员函数不覆盖任何基类虚成员函数void D::funcB(int)':成员函数不覆盖任何基类虚成员函数

我试图实现的是禁用funcA(或funcB)的警告,并让类的其余部分受到它的影响。

我试着把

#pragma warning(push)        
#pragma warning(disable:4263)
 .
 .
 .
#pragma warning(pop)    

绕过funcA,但这并不能解决问题。如果编译包了整个类,那么两个警告都会消失。

任何想法?

这是一个奇怪的错误,因为它的文档:

https://msdn.microsoft.com/en-us/library/ay4h0tc9.aspx?f=255& MSPPError = -2147217396

'function':成员函数不覆盖任何基类virtual成员函数

类函数定义与中的虚函数同名一个基类,但参数的数量或类型不同。这有效地隐藏了基类中的虚函数。

最后一句话很有趣,它向我暗示,如果你取消隐藏基类函数,警告将不再出现。

确实是这样。下面的代码不输出C4263:

class B {
public:
    virtual void funcA();
    virtual void funcB();
};
class D : public B
{
    using B::funcA;
    using B::funcB;
    virtual void funcA(int);    
    virtual void funcB(int);
};

这个警告看起来有点奇怪。如果从基类指针调度,那么派生类隐藏什么函数并不重要,因为在使用基类指针时它们不会被隐藏。但答案就在这里!

实际上是编译器在猜测你的意图。由于要引入新的签名,这意味着您将使用派生指针(而不是基指针)使用多态调度或非多态调度。如果您不这样做,就不可能调用您的过载。编译器认为,如果您这样做,您将隐藏未覆盖的函数。这就是警告的内容。

举例:

struct Base
{
    virtual void DoThing(int)
    {
        std::cout << "INT  " << std::endl;
    }
};
struct Derived: public Base
{
    virtual void DoThing(char) // Add a function to handle chars
    {
        std::cout << "CHAR  " << std::endl;
    }
};
int main()
{
    Derived *derived = new Derived;
    Base *base = derived;
    base->DoThing(1);
    derived->DoThing(1);
    derived->DoThing('a');
}
这个输出:

INT CHAR CHAR

的目的可能是添加一个重载来处理不同的情况,但它却隐藏了所有现有的重载。考虑到语言规则,这个警告是正确的。警告不是精确的,确定它没有被调用但应该被调用的情况是微不足道的。它实际上与false-warnings相反:)

要消除这个警告,应该使用using声明