web-dev-qa-db-ja.com

支配警告によるC ++継承

多くのインターフェースを実装するかなり大きなオブジェクトを実装しようとしています。これらのインターフェースのいくつかは純粋な仮想です。ダイヤモンドの継承に問題があるかもしれません。 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コンパイラの警告C4250( 'class1':継承によって 'class2 :: member'を継承する)の複製ではありません) 、私はそこで提案された解決策を試しました。

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

EDIT:完全な警告は次のとおりです:

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

gge::resource::ImageResourceは図面で大きい、gge::graphics::ImageTextureはDで、drawinは警告が出される6つのメソッドの1つです。

40
Cem Kalyoncu

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

23