Polymorphie



  • Habe hier ein Designproblem:

    Es geht um einen kleinen Wrapper um eine Netzwerkbibliothek. (Der Wrapper wird dann als Bibliothek benutzt).

    Ich habe ein Klasse "Message".

    class Message {
    public:
        virtual ~Message();
        /*
            normale methoden.
        */
        /*
            pure virtual methoden, die reimplementiert werden müssen.
        */
    };
    

    Der User leitet seine Messageklasse dann von meiner ab und reimplementiert die Methoden.

    Das Problem, dass ich jetzt habe ist:

    Wie soll die Signatur der "send" Methode in der Socketklasse aussehen?

    void send(const Message &); // geht nicht, da die constness das nicht erlaubt.
    void send(Message &); // würde gehen, aber was ist wenn der User ein const Message übergibt.
    void send(const std::shared_ptr<Message>); // würde gehen, ist das aber schön?
    

    Bedanke mich im voraus für eure Antworten.



  • Ändert send jetzt die Message oder nicht?
    Wenn nein, dann a), wenn doch, dann darf halt auch keine const-Message übergeben werden.



  • Jockelx schrieb:

    Ändert send jetzt die Message oder nicht?
    Wenn nein, dann a), wenn doch, dann darf halt auch keine const-Message übergeben werden.

    Hallo Jockelx,

    nein send ändert nicht die Message.
    Polymorphie kann man nur mit Referenzen oder Pointer nutzen. Konstante Referenzen gehen nicht.



  • sartnem schrieb:

    Polymorphie kann man nur mit Referenzen oder Pointer nutzen. Konstante Referenzen gehen nicht.

    Doch.



  • Bashar schrieb:

    sartnem schrieb:

    Polymorphie kann man nur mit Referenzen oder Pointer nutzen. Konstante Referenzen gehen nicht.

    Doch.

    OK. Dann mache ich hier was falsch:

    class Base {
    public:
    	virtual void doSomething() {  }
    };
    
    class Derived : public Base {
    public:
    	virtual void doSomething() { }
    };
    
    void foo(const Base &base) {
    	base.doSomething();
    }
    
    int main() {
    	Base *derived = new Derived;
    	foo(*derived);
    }
    


  • sartnem schrieb:

    void send(const std::shared_ptr<Message>); // würde gehen, ist das aber schön?
    

    Das ist absolute Grütze... 👎
    Mach dir Gedanken darüber, wer für die Freigabe des Objektes zuständig ist.

    Falls die Funktion beispielsweise nicht blockiert, dann sollte es wohl von der Klasse gemacht werden, zu der die send-Funktion gehört.
    Ich gehe aber mal davon aus, dass du es blockierend machst, dann sollte eine const Message& wohl die richtige Wahl sein, denn du veränderst, die Nachricht ja vermutlich nicht.
    Falls du doch nen Flag für die Message setzt (wie z. B. sent), dann ohne const.

    Gruß,
    XSpille



  • Die Funktionen müssen const sein:

    class Base {
    public:
    	virtual void doSomething() const {  }
    };
    
    class Derived : public Base {
    public:
    	virtual void doSomething() const { }
    };
    

    EDIT: Obwohl eine Fehlermeldung generell hilfreich wäre 😉



  • 💡
    *SCHOCK*!
    An das habe ich gar nicht gedacht.

    Danke an euch alle!


Anmelden zum Antworten