天天看點

warning C4250: “MyClassD”: 通過域控制繼承“MyClassC::MyClassC::MyMethod”

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的警告(代碼分析警告),該警告可通過編譯選項使其有效。

繼續閱讀