Verdeckung von virtuellen Methoden



  • Hallo liebe C++ Commu,

    ich mache mir z.z. Gedanken über das Verdecken (v) und Redefinieren (r) von virtuellen Methoden und habe hierzu auch einige listening gemacht, welche ich soweit verstehe bis auf eines, da mach ich heute nun schon ewig rum.

    Volgendes Bsp. habe ich gemacht

    class A {
    public:
       virtual void f() { cout << "A::f()" << endl; g(); }   //(v)(r1)
       virtual void g() { cout << "A::g()" << endl; }        //(r2)
    };
    
    class B : public A {
    public:
       virtual void f(int i) { cout << "B::f(int)" << endl;  }//(v)
    };
    
    class C : public B
    {
    public:
       virtual void f() { cout << "C::f()" << endl; A::f(); }//(r1)
       virtual void g() { cout << "C::g()" << endl; }        //(r2)
    };
    

    <in der Main habe ich volgendes

    int main()
    {
    C c;
    
    A * aptr = &c;
    B * bptr = &c;
    C * cptr = &c;
    
    bptr->f(1);           // Aufruf von B::f(int) -> kann ich nachvolziehen
    bptr->A::f();         // Aufruf von A::f() und C::g() -> auch klar wegen der Funktion g() in A::f()
    c.f();                // Blicke ich Null die Konsole sagt: C::f(), A::f() und C::g()??? 
    return 0;
    }
    

    Also "Zeile 11" besagt doch: Rufe c.f() auf, darin ist doch C::f() und A::f() basta und kein C::g mehr.

    Eventuel kann mir jm. einen Anstoß geben. Danke und schöne Grüße an euch.


  • Mod

    A::f ruft doch wieder g auf und das ist in diesem Fall das C::g.


Log in to reply