C4250 VC++ 警告是啥意思?
Posted
技术标签:
【中文标题】C4250 VC++ 警告是啥意思?【英文标题】:What does C4250 VC++ warning mean?C4250 VC++ 警告是什么意思? 【发布时间】:2010-02-03 07:51:53 【问题描述】:C4250 Visual C+ 警告实际上是什么意思?我已经阅读了链接的 MSDN 页面,但我仍然不明白问题所在。
编译器会警告我什么,如果我忽略警告会出现什么问题?
【问题讨论】:
MSDN文章中的解释自相矛盾。 “class2 中的一个是继承的,因为它是一个基类” - 但是 class2 是派生类,而不是他们示例中的基类。 @MSalters:我看不出矛盾。他们在示例中不使用class2
。事实上,他们从未在他们的工作示例中给出警告文本的示例。
@MSalters 我建议你再读一遍! class2 是 BASE 类。
【参考方案1】:
警告指出,如果任何weak
类操作依赖于在dominant
中实现的vbc
虚拟操作,那么这些操作可能会由于绑定在菱形继承层次结构中而改变行为.
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
中实现的虚拟方法的操作。
【讨论】:
好吧,我不明白:如何确定哪个阶级占主导地位?按要继承的类列表的顺序? @flohack:我不确定 dominant 与 weak 是正确的术语,或者它是否会混淆而不是帮助......如果你想象一个继承图,节点是类型,箭头是继承关系,在最终的对象中,从基础到 一个 完整对象将有多个路径。在每条路径中,基础中的每个虚函数都会有 一个 最终覆盖器,在其中一种类型中,更接近 complete 对象的类型。 ...您可以将虚拟继承视为图中的分支,如果其中一个分支的最终覆盖器位于分割点之上,而另一个分支提供了稍后的覆盖器,它将替换两个分支的覆盖器。在 complete 对象级别(构造的真实类型),所有路径中的最终覆盖器必须引用相同的类型,如果不是,那么您在编译时会出错。跨度> ... 警告表明编译器在上图中发现了一个 split,并且当前类型正在调用一个虚函数,其最终覆盖器位于或高于该拆分观点。这意味着该函数在图的此分支中的行为可能会受到完整对象的继承图的不同分支中的类型的影响。print
函数可以依赖于层次结构中既不高于也不低于weak
的类型。该示例称为dominant
的那个(它只是dominant,因为它支配了基础,这是这种类型所依赖的
非常有用,谢谢。但是,我只是在cmets之后才明白。也许值得编辑答案(并添加图片)?【参考方案2】:
这意味着编译器注意到您正在使用一个鲜为人知的虚拟继承特性,它有一个名称。我不知道为什么他们认为将其作为警告是个好主意,但它没有实际意义;代码应该按照语言的规定工作,它没有指出编译器的缺陷或任何东西。
【讨论】:
不开玩笑,更神秘的是,为什么它是 2 级警告而不是 4 级警告(例如“未引用的局部变量”或“变量已初始化但从未使用”)?【参考方案3】:在linked 示例中,diamond
继承了weak
和dominant
,它们实际上都继承自vbc
,但只有dominant
覆盖func()
当你不使用虚拟继承时,当你有这样的结构时,C++ 就会出现问题。但是,使用虚拟继承,问题就解决了,所以警告只是信息告诉你如果:
-
您没有使用虚拟继承,或
weak
已实现 func()
那么你会得到一个编译器错误。
所以,我的意见是,如果您知道自己在做什么,则可以安全地为整个项目禁用此警告。
【讨论】:
【参考方案4】:在 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
【讨论】:
以上是关于C4250 VC++ 警告是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Chrome Profiler 中的“未优化”警告是啥意思?