Virtuelle Klasse - Konstruktor?



  • Hallo, ich habe eine Klasse welche eine rein virtuelle Funktion enthält,
    macht es da Sinn einen Konstruktor zu schreiben?

    Weiter im Text:
    Reicht es bei dieser Klasse den
    virtual ~MyVirtualClass()
    Destruktor zu definieren oder sollte ich mich gleich um Sachen wie Kopierkonstruktor kümmern, wobei ich nicht weiß ob das mal zum einsatz kommen wird.

    PS. Mir kommt es so vor als könnte ich keine weiteren von einem meiner PCs Beiträge schreiben, könnte jmd überprüfen ob ich gesperrt bin?
    [ es erscheint ein hinweis, dass irgendwelche header schon gesendet worden wären, und etwas von spambuster]



  • ravenheart schrieb:

    Hallo, ich habe eine Klasse welche eine rein virtuelle Funktion enthält,
    macht es da Sinn einen Konstruktor zu schreiben?

    Unbedingt. Du kannst die Klasse zwar nicht als eigenständiges Objekt instantiieren, aber die (konkreten) abgeleiteten Klassen haben trotzdem immer ein Objekt der abstrakten Klasse als Subobjekt, das auch initialisiert werden muss - per Konstruktor eben.

    Weiter im Text:
    Reicht es bei dieser Klasse den
    virtual ~MyVirtualClass()
    Destruktor zu definieren oder sollte ich mich gleich um Sachen wie Kopierkonstruktor kümmern, wobei ich nicht weiß ob das mal zum einsatz kommen wird.

    Den Dtor MUSST du definieren. Wenn die Interna der Klasse nicht trivial sind und der compilergenerierte Copy-Ctor nicht ausreicht oder das falsche machen würde, dann solltest du entweder gleich einen richtigen Copy-Ctor definieren oder ihn als private deklarieren und undefiniert lassen, damit nicht aus Versehen irgendwo eine schadhafte Kopie angelegt wird. (Die kommen manchmal an Stellen wo man nicht damit rechnet, z.B. ist mir das neulich passiert als ich eine Referenz an einen boost::thread übergeben wollte - das nur am Rande)
    Das Selbe gilt dann aber auch für den operator=. Ggf reichts auch, die Klasse einfach von boost::noncopyable abzuleiten.

    PS. Mir kommt es so vor als könnte ich keine weiteren von einem meiner PCs Beiträge schreiben, könnte jmd überprüfen ob ich gesperrt bin?

    Stell die Frage am Besten im Forentechnik-Bereich, dort tummeln sich die Ansprechpartner die das beantworten können. Hier gehts eventuell unter.



  • Nein, es macht keinen Sinn, in diesem Fall Konstruktoren zu definieren. Es gibt ja -- wenn die Klasse nur virtuelle Funktionen enthält -- nichts, was initialisiert werden müsste. Wenn Du in der abstrakten Klasse etwas anbieten willst, mit dem eine Kopie erzeugt werden kann, könntest Du eine virtuelle clone-Methode benutzen.

    class abstrakt
    {
    public:
       virtual ~abstrakt() {}
       virtual abstrakt* clone() const = 0;
       virtual void foo(int) = 0;
       virtual int  bar() const = 0;
    };
    
    class konkret : public abstrakt
    {
       int zahl;
    public:
       explicit konkret(int z) : zahl(z) {}
    
       konkret* clone() const
       {
         assert( typeid(*this) == typeid(konkret) );
         return new konkret(*this);
       }
    
       void foo(int i) { zahl = i; }
       int  bar() { return zahl; }
    };
    


  • ravenheart schrieb:

    ich habe eine Klasse welche eine rein virtuelle Funktion enthält,

    Sebastian Pizer schrieb:

    Es gibt ja -- wenn die Klasse nur virtuelle Funktionen enthält -- nichts, was initialisiert werden müsste.

    Kleiner Unterschied zwischen "Die Klasse enthält (unter anderem?) eine rein virtuelle Funktion" und "Die Klasse enthält ausschließlich rein virtuelle Funktionen (und keine Datenmember)". Die Klasse erhält in jedem Fall einen Ctor, und wenns für eine datenlose Klasse der compilergenerierte nichtstuende Default-Ctor ist. Ich interpretiere die Frage des OP als "muss ich mir auch bei abstrakten Klassen Gedanken über einen Ctor machen oder kann ich den völlig außer Acht lassen?" - und da ist die Antwort "Ja, musst du, genauso wie bei normalen Klassen auch" (auch da kanns sein dass man mangels nichttrivialer Daten keinen selbstgeschriebenen Ctor braucht).


Anmelden zum Antworten