Vererbung bei Rein-Virtuellen Methoden



  • Eine Klasse wird abstrakt, wenn sie mindestens eine rein Virtuelle Methode hat.
    Eine Klasse die von dieser Erbt muss die rein Virtuelle Methode implementieren, oder sie wird auch abstrakt.
    Wenn jetzt eine weitere Klasse von der Klasse erbt, die von der abstarken Klasse erbt, muss diese die implementierte Methode auch neu implementieren um nicht abtrakt zu werden?

    Zum Beispiel:

    Klasse A hat eine rein Virtuelle Methode: virtual int foo() const = 0;
    Klasse B erbt von A und implementiert die Methode: virtual int foo() { /irgendwas/}
    Wenn jetzt eine weitere Klasse C von B erbt, muss diese dann auch foo() implementieren um nicht abstrakt zu werden?

    Ich weiß nicht ob ich meine Frage etwas verständlich gestellt habe oder ob sie überhaupt Sinn ergibt. Das Thema ist für mich ziemlich verwirrend 😕



  • @TheDude
    Hallo,

    das kannst du zwar auch selber leicht feststellen (dein Beispiel einfach bauen), aber sei's drum:

    Natürlich nicht!
    Das wäre ja extrem dämlich, wenn C nicht die Implementierungen von B nehmen dürfte.

    ps: die deutsche Übersetzung "rein virtuell" ist furchtbar; ich denke man sollte bei "pure virtual" bleiben



  • @Jockelx Macht sinn 😃
    Danke



  • Als Ergänzung:

    class A
    {
    public:
        virtual void foo1() = 0;
        virtual void foo2() = 0;
    };
    
    class B : public A
    {
    public:
        virtual void foo1() override {}
    };
    
    class C : public B
    {
    public:
        virtual void foo2() override {}
    };
    

    Klassen A und B sind abstrakt, C ist nicht abstrakt, weil es foo1() von B erbt und selber foo2() überlädt.
    Man beachte das Keyword: "override", was sicherstellt, dass es auch wirklich eine virtuelle Funktion gibt, die überladen wird.

    Dies hier:

    virtual void foo3() override {}
    

    würde z.B. in einem Compilerfehler resultieren. Du reduziert damit deine Fehlerquote.



  • @It0101 Überladen findet hier nicht statt.



  • @Bashar
    Nee, aber "override" funktioniert bei rein-virtuellen/abstrakten Funktionen genauso. daher setze ich das "override" großzügig ein.
    Vermutlich verwende ich den deutschen Begriff "überladen" in dem Fall falsch 🙂



  • @It0101 sagte in Vererbung bei Rein-Virtuellen Methoden:

    @Bashar
    Vermutlich verwende ich den deutschen Begriff "überladen" in dem Fall falsch 🙂

    Das ist mehr oder weniger das, was ich aussagen wollte. override != overload.



  • @It0101 sagte in Vererbung bei Rein-Virtuellen Methoden:

    @Bashar
    Nee, aber "override" funktioniert bei rein-virtuellen/abstrakten Funktionen genauso. daher setze ich das "override" großzügig ein.

    Dagegen ist nichts einzuwenden.

    Vermutlich verwende ich den deutschen Begriff "überladen" in dem Fall falsch 🙂

    Ja, denn was du mit "überladen" meinst, nennt sich "überschreiben".

    Überladen ist dann, wenn du eine Funktionen mit demselben Namen, aber unterschiedlichen Argumenten hast, also sowas:

    int foo(char) { return 7; }
    int foo(int) { return 42; }
    


  • @wob Deswegen bin ich eigentlich ein Freund davon, im Programmierkontext ausschließlich englisch zu sprechen. Dann kann man von "override" reden und jeder weiß was gemeint ist, weil es exakt das Schlüsselwort ist.

    Wobei "überschreiben" suggeriert, dass die virtuelle Funktion der Basisklasse irgendwie "weg" ist, was ja nicht der Fall ist.



  • Man kann es so verstehen: Die abgeleitete Klasse erbt alle Methoden der Basisklasse, überschreibt aber einige davon mit eigenen Implementierungen. Das ist wahrscheinlich das Bild, was hinter "überschreiben" steckt. Leider ist es nicht ganz korrekt, und außerdem einfach eine Folge davon, dass es keine griffige deutsche Übersetzung von "override" gibt.



  • @Bashar sagte in Vererbung bei Rein-Virtuellen Methoden:

    Leider ist es nicht ganz korrekt, und außerdem einfach eine Folge davon, dass es keine griffige deutsche Übersetzung von "override" gibt.

    Müsste ich ein deutsches Schlüssewort finden, würde ich wahrscheinlich überrang wählen. Schade nur, dass es das Wort offenbar nicht gibt - aber kann ja noch werden 😉


Anmelden zum Antworten