禁用visual C++虚函数会覆盖某些方法的警告

1 c++ overriding virtual-functions overloading visual-c++

我想在我们的代码库上启用C4263(Visual C++)警告,但是,警告会给出一些误报.我们想禁用警告,只有误报消失.我尝试用一​​些通用代码简化问题:

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


class D : public B
{
    virtual void funcA(int);    
    virtual void funcB(int);
};
Run Code Online (Sandbox Code Playgroud)

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

我想要实现的是禁用funcA(或funcB)的警告,并让其余的类受其影响.

我尝试过

#pragma warning(push)        
#pragma warning(disable:4263)
 .
 .
 .
#pragma warning(pop)    
Run Code Online (Sandbox Code Playgroud)

围绕funcA,但这并没有解决问题.如果pragma包装整个类,则两个警告都会消失.

有任何想法吗?

Gre*_*rie 9

鉴于它的文档,这是一个奇怪的错误:

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

'function':成员函数不会覆盖任何基类虚拟成员函数

类函数定义与基类中的虚函数具有相同的名称,但参数的数量或类型不同.这有效地隐藏了基类中的虚函数.

最后一句是有趣的,它向我建议,如果取消隐藏基类函数,警告将不再出现.

事实确实如此.以下代码不输出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);
};
Run Code Online (Sandbox Code Playgroud)

警告似乎有点奇怪.如果从基类指针调度,则派生类隐藏的函数无关紧要,因为在使用基类指针时它们不会被隐藏.但这就是答案!

这里实际发生的是编译器猜测你的意图.因为您正在引入新签名,这意味着您将使用派生指针(而不是基指针)使用多态或非多态分派.如果你不这样做,就不可能调用你的超载.编译器会发现,如果你这样做,你将隐藏未被覆盖的函数.这就是警告的内容.

在一个例子中:

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');
}
Run Code Online (Sandbox Code Playgroud)

这输出:

INT CHAR CHAR

目的可能是添加一个重载来处理不同的情况,而是隐藏所有现有的重载.根据语言规则,警告是正确的.警告并不准确,确定不会被调用但应该调用的情况是微不足道的.它实际上与假警告相反:)

要取消此警告,应使用using声明.