Virtuelle Funktion , nochmal virtuell in Unterklasse !



  • Hey Leute , unser Prof stellte uns neulich folgende Frage ..

    Aufgabe 4: Gegeben sind die folgenden (unvollständigen!) Klassen Shape, Rectangle und
    Circle. Ergänzen Sie jeweils an den angegebenen Stellen, in welcher Farbe die Figur gezeichnet
    
    enum Color {RED, GREEN, BLUE};
    class Area {
    public:
    virtual void draw () {
    Color color = RED;
    // Zeichnen der Figur...
    }
    // ...
    }
    class Rectangle: public Area {
    public:
    virtual void draw () {
    Color color = GREEN;
    // Zeichnen der Figur...
    }
    // ...
    }
    class Circle: public Area {
    public:
    void draw () {
    Color color = BLUE;
    // Zeichnen der Figur...
    }
    // ...
    }
    Area *a = new Area;
    Area *aRe = new Rectangle;
    Area *aCi = new Circle;
    a->draw (); // Farbe, in der gezeichnet wird:__________________
    aRe->draw (); // Farbe, in der gezeichnet wird:__________________
    aCi->draw (); // Farbe, in der gezeichnet wird:__________________
    a = aRe;
    a->draw (); // Farbe, in der gezeichnet wird:__________________
    a = aCi;
    a->draw (); // Farbe, in der gezeichnet wird:__________________
    

    Allerdings verstehe ich nicht warun er in der Unterklasse Rectangle die Funktion draw nochmals als virtuell deklariert .
    Welche Auswirkungen hat dies auf die Ausgabe der Farben ??

    Greets



  • Bacid90210 schrieb:

    Allerdings verstehe ich nicht warun er in der Unterklasse Rectangle die Funktion draw nochmals als virtuell deklariert .
    Welche Auswirkungen hat dies auf die Ausgabe der Farben ??

    Das hat gar keine Auswirkungen. Eine Funktion die in eine Basisklasse einmal als virtuel deklariert wurde, bleibt auch virtuell. Das hinzuschreiben des virtuel Keywords in abgeleiteten Klassen ist optional.



  • Das hinzuschreiben des virtuel Keywords in abgeleiteten Klassen ist optional.

    Es gehoert aber zum guten Ton.



  • Wenn ich die Funktion als virtuell deklariere.. kann ich die Klasse dann doch wieder nicht instanziieren . Oder sieht der Compiler , oh sie wurde in der Oberklasse schon als virtuell deklariert ??



  • Natürlich kannst du Klassen mit virtuelle Funktionen instanziieren. Du kannst Klassen mit abstrakten Funktionen kannst du nicht instanziieren.



  • Ok das wusste ich noch nicht .
    Vielen dank für die Info .



  • Bacid90210 schrieb:

    Ok das wusste ich noch nicht .
    Vielen dank für die Info .

    du könntest die klasse nicht instanzieren, wenn du sie wie oben gesagt abstrakt machen würdest. und das ginge so:

    class myclass
    {
    public:
       virtual void x() = 0;
    };
    

Log in to reply