菱形继承的警告,如下代码所示:
#include <stdio.h>
#include <string>
class MyClassA
{
public:
virtual void MyMethod() = 0;
};
class MyClassB : virtual public MyClassA
{
};
class MyClassC : virtual public MyClassA
{
public:
virtual void MyMethod()
{
printf("Hello, World!\n");
}
};
class MyClassD : virtual public MyClassB, virtual public MyClassC
{
public:
};
int main(int argc, char* argv[])
{
MyClassD myClassD;
myClassD.MyMethod();
return 0;
}
[问题如下]
会报如下两个错误:
1>e:\e\c++\2012年12月\staticobjectdemo\staticobjectdemo\staticobjectdemo.cpp(49): warning C4250: “MyClassD”:通过域控制继承“MyClassC::MyClassC::MyMethod”
1>e:\e\c++\2012年12月\staticobjectdemo\staticobjectdemo\staticobjectdemo.cpp(40) : 参见“MyClassC:: MyMethod”的声明
查了下,没有更好的消除解决的方法,笔者认为这是由于菱形继承的特征性所决定的。
解决方案:
一般下可以通过以下方法消除警告!
#pragma warning(push)
#pragma warning(disable:4250) //显然此处的警告号为4250,其他的警告换相对应的编号即可。
………. //此处加上对应的语句,注意一定要保证弹出警告的语句在diable:4250后,在pop前!
#pragma warning(pop)
扩展:
【msdn】#pragma warning含义——允许选择性的更改编译警告消息的行为。
使用形式如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )
Warning-specifier | 含义 |
---|---|
1, 2, 3, 4 | 应用于给定指定警告的级别,也用来使指定的缺省的警告关闭。 |
default | 重置警告行为为其缺省值,也能用于将缺省的警告关闭。这个警告缺省的产生。 |
disable | 不再弹出指定编号的的警告消息。用法:#pragma warning(disable:4250) |
error | 把指定的警告消息报告称为错误(Error)。 |
default | 重置警告行为为其缺省值,也能用于将缺省的警告关闭。这个警告缺省的产生。 |
suppress | 把pragma的当前状态放置入栈,使得下一行的指定的警告不起作用,然后弹出警告栈,重置pragma状态。你只能对每一个suppress指示器指定一次警告,不能指定多个并且,suppress仅支持C6000的警告(代码分析警告),该警告可通过编译选项使其有效。 |
作者:铭毅天下
原文:https://blog.csdn.net/laoyang360/article/details/8179844
版权声明:本文为博主原创文章,转载请附上博文链接!