实际上C4250 Visual C +警告意味着什么?我已经阅读了链接的MSDN页面,但我仍然没有解决问题所在。
编译器警告我什么,如果忽略警告可能会出现什么问题?
答案 0 :(得分:22)
警告指出,如果任何weak
类操作依赖于vbc
中实现的dominant
虚拟操作,那么这些操作可能会改变行为,因为它们是捆绑在钻石继承层次结构中。
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
中实现的虚拟方法。
答案 1 :(得分:14)
这意味着编译器已经注意到您使用的是一个鲜为人知的虚拟继承功能,它具有名称。我不知道为什么他们认为把它作为警告是一个好主意,但它没有实际意义;代码应该像语言指定的那样工作,它没有指出编译器缺陷或任何东西。
答案 2 :(得分:2)
在linked示例中,您diamond
继承了weak
和dominant
,它们都从vbc
虚拟继承,但仅dominant
}覆盖func()
当不使用虚拟继承时,如果有这样的结构,C ++就会出现问题。但是,使用虚拟继承,问题就解决了,所以警告只是信息告诉你如果:
weak
已实施func()
那么你会得到编译错误。
所以,我的意见是,如果您知道自己在做什么,可以安全地为整个项目禁用此警告。
答案 3 :(得分:2)
在VS2012中,你可以获得“无”的警告,但是从iostream继承一个类。 MS反馈article表明在这种情况下可以忽略此警告。
如果你不想压制这种警告,但想要一个不在vs2012下产生这种垃圾警告的跨平台代码,article on C4250建议在CodeInPro上添加这些无操作线来您在继承自iostream的类中的代码:
void _Add_vtordisp1() { } // Required to avoid VC++ warning C4250
void _Add_vtordisp2() { } // Required to avoid VC++ warning C4250