Vererbung "Kontext"problem



  • Hallo,

    ich habe folgenden Code:

    class Base
    {
    public:
    	Base() { x = 10; }
    	virtual void foo() { --x; }
    	virtual void bar() { return; }
    
    protected:
    	int x;
    };
    
    class Class1 : public Base
    {
    public:
    	virtual void bar() { foo(); }
    };
    
    class Class2 : public Class1
    {
    public:
    	virtual void foo() { x = x-4; }
    	virtual void bar() { Class1::bar(); }
    };
    

    Benutzt wird der Code so:

    Class2 c;
    c.bar();
    

    Erwartet hätte ich, dass in x danach 9 steht. x ist aber 6, da foo() von Class2 ausgeführt wird und nicht foo() von Class1, welches das foo() von Base wäre. Gibt es eine andere Möglichkeit den Kontext in dem der Code ausgeführt zu ändern als

    class Class1 : public Base
    {
    public:
    	virtual void bar() { Class1::foo(); }
    };
    

    zu schreiben? Sonst müsste ich ja in jeder Klasse die Funktionen so umschreiben, dass explizit nur die eigenen genommen werden, falls irgendeine Klasse von dieser erbt, ihre Funktion aufruft, aber gleichzeitig eine andere Funktion überschrieben hat, welche dann aufgerufen wird.

    greetz KN4CK3R



  • Wenn Du die Funktion virtual machst, dann darf überschrieben werden und der Überschreiber hat recht. Dann sollst Du Dich nicht an Deine private Implementierung klammern.

    Willst Du was eigenes haben, dann mach Dir doch was eigenes. Anderer Name, nicht virtual und gut ists. Das kannste dann aufrufen.



  • ich hätte aber gerne, dass wenn ich mich in einer Klasse befinde auch die Funktionen aufgerufen werden, die für diese Klasse gelten und nicht die der aufrufenden Klasse...das sollte doch eigentlich kein exotisches Problem sein oder doch?

    greetz KN4CK3R



  • virtual weglassen?


  • Mod

    KN4CK3R schrieb:

    ich hätte aber gerne, dass wenn ich mich in einer Klasse befinde auch die Funktionen aufgerufen werden, die für diese Klasse gelten und nicht die der aufrufenden Klasse...das sollte doch eigentlich kein exotisches Problem sein oder doch?

    Dann sagste Base::foo()


Anmelden zum Antworten