41

多くのインターフェイスを実装するかなり大きなオブジェクトを実装しようとしています。これらのインターフェイスの一部は、純粋な仮想です。ダイヤモンドの継承に問題がある可能性があります。Visual Studio は の警告を報告していますC4250 ('class1' : inherits 'class2::member' via dominance)。まず第一に、これらのクラスは本来あるべき姿で事実上継承されます。以下は、この問題の原因となる部分クラスの設計です。

A        B        C
 \      / \      /
  \    /   \    /
    AB       BC 
    |         |
    |        BC2
    |         |
     \        D: Implementation of B, C, BC, BC2
      \      /
        Big

このツリー全体では、D のみが仮想メソッドを実装しており、問題のメソッドの他の定義はありません。また、B のすべての仮想メソッドが警告にリストされます。重要な場合、D は完全なクラスです。

これはBoostシリアライゼーションで発生することを読みましたが、警告を無視しても安全です。

私が達成しようとしているこの方法は有効ですか?この警告を無視しても安全ですか?

注 1:これはVisual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance)の複製ではありません。そこで提案された解決策を試しました。

注 2:クラス図も送信できますが、これよりも少し複雑です。

編集: 完全な警告は次のとおりです。

warning C4250: 'gge::resource::ImageResource' : inherits 
'gge::graphics::ImageTexture::gge::graphics::ImageTexture::drawin' 
via dominance

gge::resource::ImageResourceは Big in the drawing、gge::graphics::ImageTextureは D、drawin は、私が警告を受ける 6 つのメソッドの 1 つです。

4

1 に答える 1

25

すべてが絶対に有効です。コンパイラは有効なコードについて警告することができますが、ここでは問題ありません。using宣言を使用して警告を消音することができます。これが機能しない場合(おそらくMSVCのバグが原因)、。で無音にしpragmaます。

于 2011-07-28T19:55:43.677 に答える