Merhfachableitung und Vererbung von virtuellen Methoden



  • Hallo,

    folgende Sache verstehe ich nicht komplett und hätte gerne eine Lösung. Momentan löse ich es mit explizitem Weiterleiten an die Klasse B. (B::Methode1())

    class B{
      public:
        virtual int Methode1();  //oder ohne virtual
    };
    
    class C{  //Interface
      public:
        virtual int Methode1() = 0; 
        virtual int Methode2() = 0; 
    };
    
    class A : public B, public C{
      public:
        virtual int Methode1() {B::Methode1();} // möchte ich mir sparen
        virtual int Methode2(); 
    };
    

    Den Aufbau noch mal in Worten beschrieben.
    Ich habe eine Basisklasse B mit adminsitrativer Grundfunktionalität, der auch anderswo gebraucht wird. Von der erbt Klasse A und ergänzt eigenen Kram. Die Klasse A ist die eigentlich wichtige Doing-Klasse.

    Jetzt definierte ich ein Interface C mit der Klasse A in abstracter Form benutzt wird. Es handelt sich um Teilfunktionalitäten und dort, wo C benutzt wird, möchte ich A gar nicht bekannt machen.
    Jetzt ist es aber so, dass ein Teil der Interface-Methoden von C, die A implementieren müsste, schon in der Basis B implementiert ist. Ist halt allgemeinerer Kram.

    Lasse ich den Forward weg, kommt bei VC++ sinngemäß dass kein Überschreiber vorhanden ist. Der Compiler hat zwar Recht, es ist keine Methode in A direkt, aber eben ererbt von B. Kann man das irgendwie realiseren, oder muss ich es wie oben explizit machen?

    Gruß Thomas

    Gruß Thomas



  • Kann B nicht direkt das Interface C anbieten?



  • Entweder wie Nathan geschrieben hat, oder lass die Weiterleitung drin, die ist völlig in Ordnung.



  • Nathan schrieb:

    Kann B nicht direkt das Interface C anbieten?

    Nicht wirklich. Erfundenes Beispiel:

    B ist eine Person mit Eigenschaften wie Name, Alter usw.
    A ist ein Facharbeiter, der zusätzlich zur Person halt Werkzeuge beherrscht, Tätigkeiten ausführt usw.

    C ist jetzt ein Interface für Firmen-Entity, wo es Angestellte, Maschinen, Immobilien etc. gibt. Da ist nur von Belang was und wie es heisst. Also z.B. aus einem Namen besteht und einer Tätikeit. Name kommt schon von B und Tätigkeit von A.

    C ist sozusagen ein "Querinterface".



  • Wenn C so ein "Querinterface" ist, ist es dann nicht recht unüblich/selten dass die Signaturen & Semantik der Funktionen genau übereinstimmen?



  • Edit:
    Ich sollte besser lesen.

    Dann ist es die Aufgabe von der Klasse welche von dem Interface erbt, die Funktionen zu überschreiben, also hast es mMn. schon richtig gemacht.

    Edit:
    Das hier habe auch mal gesehen:

    #define B_IMPL \
    public: \
        virtual int Methode1() \
        { \
        } \
    
    class C{  //Interface
      public:
        virtual int Methode1() = 0;
        virtual int Methode2() = 0;
    };
    
    class A : public C{
      public:
        virtual int Methode2() {}
        B_IMPL
    };
    

    Debuggen macht so aber keinen Spaß.



  • sorry, ich bin in meinem Buch wohl noch nicht soweit, aber was bedeutet das hier ?

    virtual int Methode1() = 0;
    

    wird hier ne Methode initialiesiert ? Unter was kann ich das nachlesen ?



  • Abstrakte (oder "pure virtual") Methode




Anmelden zum Antworten