Rein virtuelle Funktionen in Basisklasse aufrufen



  • Hallo Forum,

    ich habe eine Basisklasse, dessen Erben Doubles erhalten und damit irgendetwas machen sollen.

    Die Basisklasse soll nun einen Filter enthalten, der für alle Erben gleich funktionieren soll. Die Basisklasse soll nicht instanziierbar sein.

    class Base {
    public:
      void writeDouble (double number) {
        if (!filteredOut(number)) {
          transferDouble(number);
        }
      }
    
    protected:
      virtual void transferDouble (double number) = 0;
    
    private:
      bool filteredOut(double number) {
        // Pipapo
      }
    }
    

    Das funktioniert nun so leider nicht. "transferDouble" kann nur als normale virtuelle Methode implementiert werden, mit dem Hinweis, dass Erben die Klasse überschreiben dürfen. Ich möchte aber, dass der Programmierer gezwungen ist, die Methode "transferDouble" zu überschreiben. Außerdem wäre die Basisklasse ansonsten instanziierbar. 😮

    Geht das?

    Ich hoffe man kann verstehen was ich möchte.

    Vielen vielen Dank für Antworten.

    Grüße,
    anjohn



  • Oh tut mir leid. Das funktioniert doch. Ich hatte die Erben noch nicht fertig implementiert und bekam einen Fehler bezüglich der Basisklasse.

    Ich dachte darauf, dass die Basisklasse nicht übersetzt werden konnte und habe alles neu gemacht.

    Anscheinend darf man in Klassen mit reinen virtuellen Funktionen diese auch benutzen.



  • Ausserdem: Falsches Forum, nur falls du es noch nicht bemerkt hast.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vielleicht wäre das Template-Method Pattern was für dich.
    Damit ist der User gezwungen deine Klasse zu überschreiben, bekommt aber auch zwingend deine Funktionalität mit.

    class Base
    {
        void bar()
        {
            cout << "Manueeel" << endl;
            foo();
            cout << "Roflcopter" << endl;
        }
    
        virtual void foo() = 0;
    };
    
    class Derive
    {
        virtual void foo()
        {
            cout << "Hallo" << endl;
        }
    };
    

    So als Minimalbeispiel, du verstehst?!



  • Das nennt sich NVI Idiom.



  • Laut More C++ Idioms ist's dasselbe.

    Namen sind eh Schall und Rauch.


Anmelden zum Antworten