Compile-Warnung: Direct base is inaccessible
-
Hallo,
wenn ich folgendes Konstrukt habe, bekomme ich eine Warnung vom gccclass A { public: virtual int getSomeValue() const = 0; ... A(); virtual ~A(); bool operator==(A const& a) const; bool operator!=(A const& a) const; private: A(A const& a); A& operator=(A const& a); }; class B : public A { public: int getSomeValue() const; void setSomeValue(int value); B(); virtual ~B(); B& operator=(B const& b); bool operator==(B const& b) const; bool operator!=(B const& b) const; protected: virtual void someValueChanged(int value) = 0; private: int m_someValue; }; class C : public A, private B { virtual int getSomeValue() const; //Ruft die Funktion von B auf C(); C(C const& c); virtual ~C(); C& operator=(C const& c); bool operator==(C const& c); bool operator!=(C const& c); protected: virtual void someValueChanged(int value) = 0; };Bekomme ich den Fehler:
warning: direct base A inaccessible in C due to ambiguityleider kann ich mit der Warunung nichts anfangen. Ziel soll es sein, dass nach außen nur die abstrakte (schreibgeschützte) Klasse A zugreifbar sein. Intern allerdings B. Jede abgeleitete Klasse (Filter) sollen anschließend von C erben. C hat nur die Aufgabe, Schreibarbeit zu minimieren, um alle Funktionen von A auf die private Klasse B zuweisen, mit der Absicht, dass die Funktionen auch überschrieben werden können. Hoffe ihr könnt mir helfen. Danke
-
Du hast bei C zweimal von A geerbt. Einmal direkt, einmal indirekt über B. Da Du so in C einige Symbole mehrfach definiert hast, kommt es zu dem Fehler.
Schau mal, was virtuelle Vererbung ist. Das sollte helfen.
-
was virtuelle Vererbung ist weiß ich. Ich habe das jetzt so gelöst, dass das Interface nur ReadOnly-Funktionen hat, die abgeleiteten Klassen aber auch Funktionen zum Ändern haben. Nach draußen wird nur ein shared_boost<A> gegeben. Mit einer map intern werden die abgeleiteten Klassen gespeichert (angesprochen über ID). Bin da leider aber noch nicht ganz zufrieden mit.