MI - von implementationsklasse erben



  • Hallo

    ich habe 4 klassen

    struct interface // interface für alle klassen
    {
        virtual void f() = 0;
    };
    struct buttoninterface : public interface // interface für einen button
    {
    };
    class cbase: public interface // implementationsklasse, die viel zeugs verwaltet
    {
        void f(){}
    };
    class cbutton : public cbase, public buttoninterface // die button-klasse
    {
    };
    

    in diesem fall nutze ich MI um die implementation von immer wieder kehrenden
    funktionen hinzuzubinden. allerdings beschwert er sich, dass die cbutton
    klasse abstrakt ist. anscheinend verdeckt interface::f() die funktion cbase::f().

    das soll aber so nicht sein 😃

    hab auch schon versucht eine klasse dazwischenzubauen.

    ist das überhaut möglich?
    wie kann ich die cbutton klasse die methoden von cbase benutzen lassen?
    ohne alle methoden in cbutton als einzeiler einzubauen

    MfG funny_cast



  • Jein, das ist keine Verdeckung in dem Sinne. Durch mehrfache, nicht-virtuelle Vererbung hast du zwei Sub-Objekte vom Typ interface, die beide ein void f() haben wollen. Mit virtueller Vererbung sorgst du auch dafür, daß Daten nur einmal existieren, falls du sie in interface deklarierst und einige andere Haken und Ösen von Mehrfachvererbung. Natürlich gibt es dadurch die Haken und Ösen von virtueller Vererbung (du musst bei Downcasts von virtuellen Basisklassen aus dynamic_cast<> benutzen).

    struct interface
    {
        virtual void f() = 0;
    };
    struct buttoninterface : public virtual interface
    {
    };
    class cbase: public virtual interface
    {
        void f(){}
    };
    class cbutton : public cbase, public buttoninterface
    {
    };
    

    Leitest du von cbutton weitere Klassen ab, die wiederum mehrfach von interface, buttoninterface oder cbase erben, dann solltest du auch in cbutton virtuell von cbase und buttoninterface erben.


Anmelden zum Antworten