2016-10-12 2 views
0

警告C4594 2015

class A 
{}; 

class B : virtual public A 
{}; 

class C : private B 
{}; 

class D : public C 
{}; 

私はVS2012

私はこれを取得なぜ
warning C4594: 
class 'main::D' can never be instantiated- indirect virtual base class 'main::A' is inaccessible 

note: 'main::A' is a public base class of 'main::B' 

note: 'main::B' is a private base class of 'main::C' 

で見たことがないコンパイラの警告を取得?

私のVS2015警告レベルは/ W3、プラットフォームToolset v140です。

+2

コンパイラがこの警告を発行しないのはなぜですか? – IInspectable

+0

警告は正しいですが、なぜコンパイラVS2012はこの警告を出さないのですか? – rich

+0

それは奇妙な質問です。それはアポロ13号の宇宙飛行士を救助するためにスペースシャトルを送っていなかった理由を聞くのとほぼ同じです。論理的な飛躍を遂げる。 – IInspectable

答えて

2

仮想基本クラスは、最も派生したクラスから直接初期化されます。

したがって、ほとんどの派生クラスで仮想ベースにアクセスできない場合、コードは無効です。

+0

軽度ニックピッキング:コードは有効です。 'D'型のオブジェクトをインスタンス化することは有効ではありません。したがって、これは警告であり、エラーメッセージではありません。 – IInspectable

+0

@IInspectable:そうです、言及いただきありがとうございます。この回答を投稿した後に編集するかどうかはわかりませんでした。しかし、私はOPがクラスDを何にも使わずに定義しているとは思っていませんでした。まだ。 Hm。 –