2016-10-12 3 views
0

Mit folgendem Code Warnung:C4594 in Visual Studio 2015

class A 
{}; 

class B : virtual public A 
{}; 

class C : private B 
{}; 

class D : public C 
{}; 

ich eine Compiler-Warnung erhalten, die ich nie

in VS2012 gesehen habe
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' 

Warum ich dies zu tun bekommen?

Meine VS2015 Warnstufe ist/W3, Plattform Toolset v140.

+2

Warum sollte der Compiler diese Warnung nicht ausgeben? – IInspectable

+0

Warnung ist richtig, aber warum Compiler VS2012 diese Warnung nicht ausgeben? – rich

+0

Das ist eine merkwürdige Frage. Es ist fast so, als würde man fragen, warum sie kein Space Shuttle geschickt haben, um die Astronauten von Apollo 13 zu retten. Mach einen logischen Sprung. – IInspectable

Antwort

2

Eine virtuelle Basisklasse wird direkt von der abgeleiteten Klasse initialisiert.

Daher ist der Code ungültig, wenn auf die virtuelle Basis in der abgeleiteten Klasse nicht zugegriffen werden kann.

+0

Geringfügige Nitpicking: Der Code ist gültig. Das Instanziieren eines Objekts vom Typ "D" wäre nicht gültig. Daher ist dies eine Warnung, keine Fehlermeldung. – IInspectable

+0

@Intensible: Sie haben Recht, danke für die Erwähnung. Ich war mir nicht sicher, ob ich nach der Veröffentlichung dieser Antwort noch etwas bearbeiten sollte. Aber ich dachte, dass das OP Klasse D nicht definieren würde, ohne es für irgendetwas zu benutzen. Immer noch. Hm. –