C++ rein abstrakte Klassen???



  • Hallo, nun wollte ich mich dran machen eine saubere Klassenimplementation für mein späteres eigentliches Projekt zum Thema Sockets zu schreiben und da fiel mir eines auf:

    Gibt es eigentlich in C++ die Möglichkeit rein abstrakte Klassen zu definieren?

    Das Problem ist, das Objekte der Oberklasse in meinem Fall nicht sinnvoll wären.
    Nun wie definiere ich denn dann eine abstrakte Klasse ohne das virtual ... =0
    es gibt da keine Funktion bei der das virtual in meinem Fall sinn machen würde, da alle Funktionen in den abgeleiteten Klassen genau so benötigt werden.

    Ich hab gelesen das es allerdings so gehen könnte wenn man den Destruktor virtual deklarieren würde, allerdings meckert da mein Compiler wenn ich schreibe

    ~Klassenname()=0;

    Also gibts denn dann da nen Workaround.



  • procrash schrieb:

    Hallo, nun wollte ich mich dran machen eine saubere Klassenimplementation für mein späteres eigentliches Projekt zum Thema Sockets zu schreiben und da fiel mir eines auf:

    Gibt es eigentlich in C++ die Möglichkeit rein abstrakte Klassen zu definieren?

    Ja.

    Das Problem ist, das Objekte der Oberklasse in meinem Fall nicht sinnvoll wären.
    Nun wie definiere ich denn dann eine abstrakte Klasse ohne das virtual ... =0

    Über virtual xxx = 0; 🙂

    Ich hab gelesen das es allerdings so gehen könnte wenn man den Destruktor virtual deklarieren würde, allerdings meckert da mein Compiler wenn ich schreibe

    ~Klassenname()=0;

    Na ja, vllt. weil das virtual fehlt?

    Siehe auch hier: http://tutorial.schornboeck.net/pure_virtual.htm

    MfG

    GPC



  • Hier gibt es noch einen schönen langen Thread zu diesem Thema
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-159390.html



  • man muss eine funktion gleich null setzen und nicht einfach virtual.

    d.h.:
    anstatt von
    void bla();

    halt
    void bla() = 0; // darf afaik nicht definiert werden



  • Das eigentliche Problem ist das du den Destruktor warscheinlich nicht definiert hast.

    class foo
    {
      virtual ~foo() = 0;
    };
    
    foo::~foo()
    {}
    

    Das ist nämlich immer notwendig, auch wenn dein D'tor rein virtuell ist!
    Achja, virtuell sollte er sowiso sein wenn deine Klasse als Basisklasse fungiert.

    grüße



  • Herrb schrieb:

    ...= 0; // darf afaik nicht definiert werden

    Hab' ich auch mal gedacht. Stimmt aber nicht ! s.a. o.a. link 😃

    Gruß,

    Simon2.



  • Alle Konstruktoren der abstrakten Klasse als "protected" deklarieren?



  • anonymus schrieb:

    Alle Konstruktoren der abstrakten Klasse als "protected" deklarieren?

    Und dann?



  • David_pb schrieb:

    anonymus schrieb:

    Alle Konstruktoren der abstrakten Klasse als "protected" deklarieren?

    Und dann?

    dann kann nurnoch eine abgeleitete Klasse Objekte davon erstellen. Alle andren haben kein zugriffsrecht mehr auf den Ctor.

    ist eine alternative zum abstrakten dtor.



  • Yo, da find ich dein rein virtuellen D'tor aber eingängiger!


Anmelden zum Antworten