warning C4250: “MyClassD”: 通過域控制繼承“MyClassC::MyClassC::MyMethod”
菱形繼承的警告,如下代碼所示:
#include <stdio.h>
#include <string>
class MyClassA
{
public:
virtual void MyMethod() = 0;
};
class MyClassB : virtual public MyClassA
class MyClassC : virtual public MyClassA
virtual void MyMethod()
{
printf("Hello, World!\n");
}
class MyClassD : virtual public MyClassB, virtual public MyClassC
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警告辨別符如下:
Warning-specifier
含義
1, 2, 3, 4
應用于給定指定警告的級别,也用來使指定的預設的警告關閉。
default
重置警告行為為其預設值,也能用于将預設的警告關閉。這個警告預設的産生。
disable
不再彈出指定編号的的警告消息。用法:#pragma warning(disable:4250)
error
把指定的警告消息報告稱為錯誤(Error)。
once
僅顯示指定的警告消息一次。
suppress
把pragma的目前狀态放置入棧,使得下一行的指定的警告不起作用,然後彈出警告棧,重置pragma狀态。你隻能對每一個suppress訓示器指定一次警告,不能指定多個并且,suppress僅支援C6000的警告(代碼分析警告),該警告可通過編譯選項使其有效。