Klassendeklaration einer "virtuellen Klasse" ?



  • Hi,

    ich mache gerade eine alte Klausuraufgabe und bin mir nicht ganz sicher wie ich sie korrekt löse.

    Die Aufgabe lautet:
    Schreiben Sie eine vollständige Klassendeklaration mit allen mindestens verfügbaren Methoden für eine virtuelle Klasse Artikel (Artikel.h), welche folgende private Datenelemente enthält:
    string name;
    int *artikelgroessen;
    float preis;

    Mein Lösungsansatz:

    class Artikel
    {
       private:
          string name;
          int *artikelgroessen;
          float preis;
    
       public:
          Artikel();
          Artikel(Artikel const &other);
          Artikel &operator=(Artikel const &other);
          ~Artikel();
    }
    

    Was mich allerdings verwirrt ist, dass die Klasse virtuell sein soll... ich finde nirgends etwas dazu... meint ihr ich kann das so lassen?

    Greez
    Haimi



  • Suche nach dem Schlüsselwort

    virtual
    


  • Ich weiß was eine abstrakte Klasse ist.. jedoch verwirrt es mich in dem Zusammenhang.

    Nach dem, was ich gelesen habe, ist eine Klasse abstrakt oder rein virtuell, wenn sie Methoden hat, die virtuell deklariert wurden, wie z.B.
    virtual void print() = 0;

    Aber ich kann es nicht ganz in Zusammenhang zu der Aufgabe bringen.



  • Die Aufgabe ist auch ziemlich blöd - finde ich jedenfalls.

    Du kannst den Destruktor pure virtual machen um die Klass abstrakt zu machen:

    class Artikel
    {
       private:
          string name;
          int *artikelgroessen;
          float preis;
    
       public:
          Artikel();
          Artikel(Artikel const &other);
          Artikel &operator=(Artikel const &other);
          virtual ~Artikel() = 0 { }
    }
    


  • Haimi schrieb:

    Schreiben Sie eine vollständige Klassendeklaration mit allen mindestens verfügbaren Methoden für eine virtuelle Klasse Artike

    Den Terminus "virtuelle Klasse" gibt es nicht im normalen C++ Sprachgebrauch. Es gibt virtuelle Basisklassen (genauer: virtuelle Vererbung). Aber das scheint nicht damit gemeint zu sein. Du musst mal in den Vorlesungsunterlagen nachgucken, was der Prof damit gemeint haben könnte. Vielleicht meinte er "polymorph" statt "virtuell". Aber aus dem Aufgabentext allein geht nicht hervor, was der Aufgabensteller sehen will.



  • Das ist ein guter Lösungsansatz... ich habe auch schon in die Richtung überlegt, allerdings war ich mir nicht sicher ob es so richtig sein könnte und wenn ich eine Funktion rein virtuell mache, welche ich dann nehmen würde.

    Den Zerstörer virtuell zu machen ist natürlich doppelt schön fällt mir gerade auf, weil es noch mal das bestätigt, was ich im Skript gefunden, habe, dass nämlich eine abstrakte Klasse, sobald sie eine virtuelle Funktion enthält, auch einen virtuellen Destruktor haben soll.

    Dankeschön 🙂

    Greez
    Haimi



  • Haimi schrieb:

    Ich weiß was eine abstrakte Klasse ist.. jedoch verwirrt es mich in dem Zusammenhang.

    Nach dem, was ich gelesen habe, ist eine Klasse abstrakt oder rein virtuell, wenn sie Methoden hat, die virtuell deklariert wurden, wie z.B.
    virtual void print() = 0;

    Aber ich kann es nicht ganz in Zusammenhang zu der Aufgabe bringen.

    Du beantwortest dir deine Frage doch schon selber. Eine Klasse ist abstrakt oder rein virtuell, wenn davon keine Instanz gebildet werden kann.
    Das wird dadurch gekennzeichnet dass nicht alle Methoden implementiert sind. Eine rein virtuelle Methode hat demzufolge keinen Funktionsrumpf (@θ).



  • @Martin Fischer: Man darf trotzdem... beim Destruktor muss man sogar...



  • Haimi schrieb:

    ...nämlich eine abstrakte Klasse, sobald sie eine virtuelle Funktion enthält, auch einen virtuellen Destruktor haben soll.

    Die Daumenregel (nach Scott Meyers) sagt: Sie sollte dann einen öffentlichen virtuellen Destruktor oder einen geschützten nicht-virtuellen Destruktor haben.


Anmelden zum Antworten