【发布时间】:2015-11-13 01:01:54
【问题描述】:
我想在我们的代码库上启用 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 但这并不能解决问题。如果编译指示包含整个类,则两个警告都会消失。
有什么想法吗?
【问题讨论】:
-
这不是误报。您正在使用
funcA(int)重载,但没有覆盖funcA()。 -
这是一个误报,因为我确实想要一个名为 funcA(int) 的方法。这不是 C++ 中的错误,根据具体情况,它可能是有意义的。我想说的是:程序员打算覆盖 funcB() 但未能这样做,因此必须显示警告。在 funcA 的情况下,程序员实际上想要添加一个 funcA(int)(因此无意覆盖 funcA()),因此他/她应该有可能告诉编译器“没关系,不要向我显示警告这个”
-
不是您问题的答案,但您是否考虑过要求在您的编码标准中使用新的 C++11
override关键字?在这种情况下,如果程序员真的打算重写 funcB() 并且已经使用override表示了同样多的内容,他们将得到错误 C3668。 -
仅仅因为编译器的行为不完全符合您的要求并不意味着它是误报或错误的。警告是 100% 正确的,应根据警告级别发出。如果您想摆脱警告,请在派生类中提供
funcA()的定义,并将其调用到基类中。编译器将(在大多数情况下)通过调度表中的条目优化调用。
标签: c++ visual-c++ virtual-functions overloading overriding