C4250 VC++警告意味着什么?

sha*_*oth 11 c++ visual-studio visual-c++

什么是C4250的Visual C +警告在实用性方面是什么意思?我已经阅读了链接的MSDN页面,但我仍然没有得到问题所在.

编译器警告我什么,如果忽略警告可能会出现什么问题?

Dav*_*eas 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
}
Run Code Online (Sandbox Code Playgroud)

这是标准指定的行为,但对于程序员有时可能会感到惊讶,weak::print操作行为已经改变,不是因为层次结构中上面或下面的重写方法,而是因为继承层次结构中的兄弟类,当调用时来自derived.请注意,从derived视角来看它是完全合理的,它调用的操作依赖于实现的虚拟方法dominant.

  • 那么我不明白的是:如何确定哪个阶级占主导地位?按继承的类列表的顺序? (2认同)

CB *_*ley 15

这意味着编译器已经注意到您使用的是一个鲜为人知的虚拟继承功能,它具有名称.我不知道为什么他们认为把它作为警告是一个好主意,但它没有实际意义; 代码应该像语言指定的那样工作,它没有指出编译器缺陷或任何东西.