C4250 Visual C+ 警告在实际中意味着什么?我已阅读链接的 MSDN 页面,但我仍然不明白问题出在哪里。
编译器会警告我什么?如果我忽略警告可能会出现什么问题?
警告指出,如果任何
weak
类操作依赖于 vbc
中实现的 dominant
虚拟操作,那么这些操作可能会改变行为,因为它们捆绑在菱形继承层次结构中。
#include <iostream>
struct base {
virtual int number() { return 0; }
};
struct weak : public virtual base {
void print() { // seems to only depend on base, but depends on dominant
std::cout << number() << std::endl;
}
};
struct dominant : public virtual base {
int number() { return 5; }
};
struct derived : public weak, public dominant {};
int main() {
weak w; w.print(); // 0
derived d; d.print(); // 5
}
这是标准指定的行为,但有时程序员可能会感到惊讶,
weak::print
操作行为的改变不是因为层次结构中上方或下方的重写方法,而是因为继承中的同级类层次结构,当从 derived
调用时。请注意,从 derived
的角度来看,这是完全有意义的,它正在调用依赖于 dominant
中实现的虚拟方法的操作。
这意味着编译器已经注意到您正在使用一个鲜为人知的虚拟继承功能,该功能有其名称。我不知道为什么他们认为将其作为警告是个好主意,但它没有实际意义;代码应该按照语言指定的方式工作,而不是指出编译器缺陷或任何东西。
在 linked 示例中,
diamond
继承了 weak
和 dominant
,两者实际上都继承自 vbc
,但只有 dominant
覆盖了 func()
当您不使用虚拟继承时,如果有这样的结构,C++ 中就会出现问题。 然而,有了虚拟继承,问题就解决了,所以警告只是信息告诉你,如果:
weak
已实施func()
然后你会得到一个编译器错误。
因此,我的观点是,如果您知道自己在做什么,则可以安全地在整个项目中禁用此警告。
在 VS2012 中,除了从 iostream 继承类之外,您可能会因“无任何内容”而收到此警告。 MS 反馈文章指出,在这种情况下可以忽略此警告。
如果您不想抑制此类警告,但想要一个在 vs2012 下不会产生此垃圾警告的跨平台代码,CodeInPro 上的一篇关于 C4250 的文章建议将这些不执行任何操作的行添加到您的代码中在从 iostream 继承的类中:
void _Add_vtordisp1() { } // Required to avoid VC++ warning C4250
void _Add_vtordisp2() { } // Required to avoid VC++ warning C4250