禁用visualc++虚函数覆盖某些方法的警告
Disabling visual C++ virtual function override warning for certain methods
我想在我们的代码库上启用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声明
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- G++ 编译器未为未定义的方法生成错误/警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- GCC 7,-隐式故障警告,以及清除它们的便携式方法
- 是否有跨平台的方法可以在C++中禁用已弃用的警告?
- 将赋值运算符与make_pair方法一起使用会生成 CLion 警告
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 在C++中将已签名/未签名的警告静音的侵入性最小的方法是什么?
- C :覆盖不弃用的虚拟方法时的贬值警告
- 有什么方法可以为函数指针比较生成警告?
- 在 Clang 中禁用特定警告实例的简洁方法
- 来自 Boost 的 JSON 解析器的警告 C4512 的解决方法
- 修复警告"field a is not used"如果字段在配置中未使用的好方法
- 由于未签名,以模板方法的方式摆脱警告
- 是否有一种方法可以找到导致警告出现在QT中的线路
- std::error_code 是发出警告的好方法吗?
- 重写的虚拟方法上的警告不明确
- 在 C++ 中修复类型转换警告的最佳方法
- 为什么 G++ 不为不返回任何内容的模板方法生成警告?