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包装整个类,则两个警告都会消失.
有任何想法吗?
鉴于它的文档,这是一个奇怪的错误:
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声明.