Compile-Warnung: Direct base is inaccessible



  • Hallo,
    wenn ich folgendes Konstrukt habe, bekomme ich eine Warnung vom gcc

    class 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 ambiguity

    leider 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.


Anmelden zum Antworten