Überschreiben von Funktionen



  • Das ist eine Probeklausuraufgabe. Das Programm ist gegeben und man soll die Ausgabe angeben:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct A
    {
        virtual void a() = 0;
    };
    
    class B : public A
    {
    public:
        B()
        {
            ausgabe("B()");
        }
        virtual ~B()
        {
            ausgabe("~B()");
        }
        static void ausgabe(const
                            string& text)
        {
            cout << "#" << z << ": "
                 << text << endl;
            z++;
        }
    private:
        static int z;
    };
    
    int B::z = 0;
    
    class C : public B
    {
    public:
        C()
        {
            ausgabe("C()");
        }
        virtual ~C()
        {
            ausgabe("~C()");
        }
        void a()
        {
            ausgabe("C::a()");
        }
        void c()
        {
            ausgabe("C::c()");
        }
    };
    
    class D : public C
    {
    public:
        D()
        {
            ausgabe("D()");
        }
        virtual ~D()
        {
            ausgabe("~D()");
        }
        void a()
        {
            ausgabe("D::a()");
        }
        void c()
        {
            ausgabe("D::c()");
        }
        void d()
        {
            ausgabe("D::d()");
            C::a();
        }
    };
    
    int main()
    {
        B::ausgabe("START");
        A* za = new C();
        za->a();
        delete za;
        B* zb = new C();
        zb->a();
        delete zb;
        D d;
        A& ra = d;
        ra.a();
        C& rc = d;
        rc.a();
        rc.c();
        D& rd = d;
        rd.a();
        rd.c();
        rd.d();
        B::ausgabe("ENDE");
    }
    

    Es geht um die Zeilen:

    C& rc = d;
        rc.a();
        rc.c();
    

    Ich dachte es würde das hier ausgeben:
    #13: D::a()
    #14: D::c()

    Allerdings gibt es das hier aus:
    #13: D::a()
    #14: C::c()

    Ich versteh nicht warum es C::c() ausgibt. D::c() überschreibt es scheinbar nicht.
    Allerdings wird C::a() in der Zeile davor von D::a() überschrieben.
    Warum überschreibt er es in Zeile 13, aber nicht in Zeile 14?



  • a ist virtual und c nicht.



  • Bashar schrieb:

    a ist virtual und c nicht.

    a() ist nicht virtual.
    a() und c() sind genau gleich definiert (mit dem Unterschied, dass sie anders heißen)



  • Wenn du das so genau weißt, wieso fragst du dann? Und dein Compiler ist wohl auch kaputt 🙄



  • Bashar schrieb:

    Wenn du das so genau weißt, wieso fragst du dann?

    Weil ich mir es nicht erklären kann warum a() überschrieben wird und c() nicht obwohl sie gleich definiert sind.

    Bashar schrieb:

    Und dein Compiler ist wohl auch kaputt 🙄

    Wie kommst du zu dieser Feststellung?



  • Redsister schrieb:

    Weil ich mir es nicht erklären kann warum a() überschrieben wird und c() nicht obwohl sie gleich definiert sind.

    Sind sie nicht! a ist in der Basisklasse als virtuell deklariert!

    virtual void a() = 0;
    

    Redsister schrieb:

    Wie kommst du zu dieser Feststellung?

    Wenn sowohl Leute, bei denen du um Hilfe fragst, als auch der Compiler eindeutig darauf hinweisen, dass deine Annahme falsch ist, was ist wohl der naheliegendste Schluss? Dass wir Unrecht haben und der Compiler kaputt ist, genau.



  • Nexus schrieb:

    Redsister schrieb:

    Weil ich mir es nicht erklären kann warum a() überschrieben wird und c() nicht obwohl sie gleich definiert sind.

    Sind sie nicht! a ist in der Basisklasse als virtuell deklariert!

    virtual void a() = 0;
    

    Redsister schrieb:

    Wie kommst du zu dieser Feststellung?

    Wenn sowohl Leute, bei denen du um Hilfe fragst, als auch der Compiler eindeutig darauf hinweisen, dass deine Annahme falsch ist, was ist wohl der naheliegendste Schluss? Dass wir Unrecht haben und der Compiler kaputt ist, genau.

    Tut mir leid, wenn du dich angegriffen gefühlt hast. Ich wollte deine Antwort nicht in Frage stellen. 😞

    Redsister schrieb:

    Bashar schrieb:

    a ist virtual und c nicht.

    a() ist nicht virtual.
    a() und c() sind genau gleich definiert (mit dem Unterschied, dass sie anders heißen)

    Ich habe lediglich das virtual a() in struct A nicht gesehen. Einen Hinweis darauf wo es steht hätte genügt, dann hätte ich dir sofort geglaubt.

    Aber trotzdem vielen Dank für deine Antwort! 😉



  • Redsister schrieb:

    Tut mir leid, wenn du dich angegriffen gefühlt hast. Ich wollte deine Antwort nicht in Frage stellen. 😞

    War nicht meine Antwort, sondern Bashars.

    Vielleicht ein genereller Hinweis: Lies Antworten lieber zwei Mal durch und versuche genau zu verstehen, was damit gemeint ist, statt a priori zu widersprechen... besonders wenn wie erwähnt alles darauf hindeutet, dass sie stimmen könnte 🙂



  • Oh, hab grad nicht auf den Namen geachtet

    Nexus schrieb:

    Vielleicht ein genereller Hinweis: Lies Antworten lieber zwei Mal durch und versuche genau zu verstehen, was damit gemeint ist, statt a priori zu widersprechen... besonders wenn wie erwähnt alles darauf hindeutet, dass sie stimmen könnte 🙂

    Ich hab ja nicht ausgeschlossen, dass es stimmen könnte, nur hab ich nicht gesehen wo es steht. Du hast es ja so geschrieben, dass ich wusste wo es stand.
    Hätte ich das virtual gesehen wäre die Frage überflüssig gewesen.
    Ich formulier es das nächste mal anders, wenn ich etwas nicht sehe.


Anmelden zum Antworten